如何连接选项卡控件
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 cbAnalyse
的SelectedIndexChanged
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) 获取额外数据?