2

我有我用 C# 编写的 Winform 应用程序。在我的表单上,我有一个包含七页的 TabControl,每一页都充满了元素(主要是 TextBoxes 和 DropDownLists)。我使用 DataReader 提取一些信息,填充 DataTable,并使用元素的 DataBindings.Add 方法用当前值填充这些元素。

用户可以在这些元素中输入数据,按“保存”,然后我使用元素的文本字段设置更新查询的参数。例如:

updateCommand.Parameters.Add("@CustomerName", SqlDbType.VarChar, 100).Value = CustomerName.Text;

我遇到的问题是,一旦我加载表单,所有元素显然都被认为是空的,直到我手动选择每个选项卡。因此,如果我在加载表单后立即按“保存”,我尚未选择的 TabPages 上的所有字段都会尝试使用空数据进行更新(不好)。当我选择每个 TabPage 时,这些元素现在将正确地发送它们的数据。目前,我已经制定了一个(非常)丑陋的解决方法,我在第一次填充数据时以编程方式选择每个 TabPage,但这是一个不可接受的长期解决方案。

我的问题是,如何在用户选择该 TabPage 之前让 TabPages 上的所有元素正确返回其数据?

4

4 回答 4

7

何是正确的;在选择 TabPage 之前,不会创建 TabPage 上的元素。我刚刚在表单加载时添加了一个循环来选择每个 TabPage,现在它可以正常工作了。

foreach (TabPage tp in tabControl1.TabPages)
{
    tp.Show();
}
于 2010-04-20T20:24:28.057 回答
4

我不确定你是否可以。以下是来自 MSDN 的引用:

“在显示选项卡页之前不会创建 TabPage 中包含的控件,并且在显示选项卡页之前不会激活这些控件中的任何数据绑定。”

但是,不是让更新代码直接从控件中获取值,也许您可​​以创建一个类来保存您用来填充控件的 DataTable,然后当调用更新代码时,它会向类询问值和类检查控件是否已加载,否则它会从 DataTable 中获取值。

于 2010-04-20T20:08:48.533 回答
1

问题是在显示选项卡之前不会创建控件。一种解决方案是在加载页面时实际创建控件,如下所示:

private static void CreateControls( Control control )
{
    CreateControl( control );
    foreach ( Control subcontrol in control.Controls )
    {
        CreateControl( subcontrol );
    }
}
private static void CreateControl( Control control )
{
    var method = control.GetType().GetMethod( "CreateControl", BindingFlags.Instance | BindingFlags.NonPublic );
    var parameters = method.GetParameters();
    method.Invoke( control, new object[] { true } );
}

然后在表单的构造函数中,您将执行以下操作:

public Form()
{
    CreateControls( this.tabPage1 );
}

此解决方案依赖于这样一个事实,即有一个内部 CreateControls 方法采用单个布尔参数,即使它不可见,您也可以创建控件。

于 2010-04-20T20:42:41.083 回答
0

我解决此问题的方法是将以下代码添加到表单加载事件中;

this.tabcontrol1.BindingContext = this.BindingContext;

于 2015-03-20T17:41:20.020 回答