如何连接选项卡控件

Posted

技术标签:

【中文标题】如何连接选项卡控件【英文标题】:How to connect Tab Controls 【发布时间】:2015-08-30 15:47:17 【问题描述】:

我的 winForms 应用程序有一个选项卡控件,它由两个选项卡(tab1 和 tab2)组成。在 tab2 中,从数据库(产品信息)的 datagridview 中获取数据。 在 tab1 中,我有一个组合框 [sales analysis],它使用户可以选择一个选项。 我现在想在 cb 选择时从 tab1 访问 tab2,向我显示来自 tab2 数据网格中数据的区域销售信息。 可能吗?我真的不知道从哪里开始

tab1 图片

tab2

期望:

如果选择了 tab1 中的组合框,则它应该查看 tab2 中的 datagridview,其中(区域)North、East、West 等,然后将 sale 13、sales 14 .. 相加并分别显示在 textBoxes 中。

【问题讨论】:

要访问任何内容,您只需要对其进行引用。如果您的 TabPages 基本上是静态的,您可以以任何您喜欢的方式添加引用。但是因为无论如何它们都是相同的形式(?)他们已经互相看到了。所以根本没有什么可做的..! - 如果 TabPages 包含 Usercontrols,这不是真的。他们吗?如果是这样,请更新 qour 问题! @TaW。一个例子将是一个很好的开始。唯一的用户控件是用于选择的combobox 唯一的用户控件是组合框 可能不是。有关 CustomControls 和 UserControls 之间的区别,请参阅here!如果它是 CustomControls(又名子类​​),则没有问题。如果它毕竟是一个 UserControl,你将不得不以某种方式公开它的字段,最好是通过 Properties.. cb selection 是什么?一个事件? ComboBox 的 selectionChanged?还是命令按钮??请编辑您的问题,使其准确完整! @TaW。谢谢。我现在明白你了。这是一个用户控件。 cb selection ComboBox 的 selectionChanged。这意味着如果选择了组合框,那么它应该查看 tab2 中的 datagridview,其中 North、East、West 等在哪里,并将 sale 13、sales 14 .. 和分别显示在 textBoxes 中。 【参考方案1】:

如果我猜对了,每当您更改销售分析组合中的值时,应该激活包含数据网格的标签页。 您可以将选项卡控件的选定索引设置为数据网格选项卡,它应该可以工作

this.tabControl1.SelectedIndex = 1;//Index of data grid tab

【讨论】:

不应激活任何 tab2。如果选择了combobox,那么它应该查看tab2 中的datagridview,其中North、East、West 等在哪里,并将sale 13、sales 14 相加并分别显示在textBoxes 中。我已经更新了我的问题 @James:在这种情况下,您必须有一些网格数据源,例如数据表。只需从数据源中找到“Region”等于组合选定值的记录,获得记录后,分别从“Sales13、14 和 15”中找到相应的值。【参考方案2】:

由于您的控件都位于一个表单中,因此它们的方法都可以相互引用,而无需任何额外帮助。

所以你可以写ComboBox cbAnalyseSelectedIndexChanged

cbAnalyse_SelectedIndexChanged(object sender, EventArgs e) 
 
   if (cbAnalyse.SelectedItem.ToStringndex == "Sales Analysis"
   
        someTextbox1.Text = ColumnSum(yourDataGridView, someColumn1) + "$";
        someTextbox2.Text = ColumnSum(yourDataGridView, someColumn2) + "$";
   

这使用了一个小的辅助函数,它总结了 DataGridView 中一列的所有值:

decimal ColumnSum(DataGridView dgv, int columnIndex)

    decimal sum = 0m;
    for (int row = 0; row < DGV.Rows.Count; row++)
       if (DGV[columnIndex, row].Value != null) sum += Convert.ToDecimal(DGV[1, row].Value);
    return sum;

当人们需要引用位于同一表单中但位于第 2、第 3 等表单中的控件时,他们经常会遇到问题。或者当它们是 Usercontrol 的一部分时,Usercontrol 是用于保存控件的自定义容器。

在这两种情况下,这些控件默认是其他表单或用户对象的私有成员。

在这些情况下,需要为它们创建某种公共访问器,通常是通过属性。对于表单,还需要提供对其他表单的引用,通常在打开它们时存储。

在这种情况下,2nd Form 通常还需要对 1st Form 进行反向引用; this 通常在构造函数中传入。

但在你的情况下,这些并发症都不重要。您所需要的只是连接所有这些文本框的耐心;-)

更新:由于您似乎在获取中间和时也遇到了问题,并且需要允许 Tab 2 的行中存在重复区域,因此您还希望使用一个函数来计算where 子句:

decimal ColumnSumWhere(DataGridView dgv, int columnIndex, string region)

    decimal sum = 0m;
    for (int row = 0; row < DGV.Rows.Count; row++)
       if (DGV[columnIndex, row].Value != null) &&
          (DGV[regionColumn, row].Value.ToString() == region)
               sum += Convert.ToDecimal(DGV[1, row].Value);
    return sum;

【讨论】:

感谢 TaW。如果我成功与否,我会检查您的建议并给您反馈。我希望我会成功。 Schönen Tag noch ;-) 嗨,TaW。不幸的是我做不到。问题是我认为我需要一个where clause 来总结我需要的属性。我认为您的样本总结了整个专栏,对吗?回到 sales13 列中的我的 DVG,north 的值是 2x 800。所以 north shd 的 txtBox 显示 1600 在sales13列中,north的值是2x 800。所以north shd的txtBox显示1600嗯,没有。你的意思是800+200=1000?在 Tab2 中重复行是否正确? (我相信,当我写下我的答案时,这并不存在。)如果是这样,那么带有“?”的行呢?在 Tab1 中?也不要重复,我希望..?! @TaW.Guten 标签!谢谢,这是一个很大的帮助。

以上是关于如何连接选项卡控件的主要内容,如果未能解决你的问题,请参考以下文章

如何从 MFC 选项卡控件 (TabCtrl) 获取额外数据?

如何从MFC选项卡控件(TabCtrl)获取额外数据?

如何将 WPF 选项卡项标题拉伸到父控件宽度

Vb.net 如何以编程方式选择选项卡控件中的最后一个选项卡

如何通过 VBA 设置访问选项卡控件的页面名称

设置颜色时,如何使组合框显示像 VS' 这样的选项卡控件?