C# WinC窗体TabControl元素在选择TabPage之前读取为空

C# WinC窗体TabControl元素在选择TabPage之前读取为空,c#,winforms,tabcontrol,tabpage,C#,Winforms,Tabcontrol,Tabpage,我有一个Winform应用程序,我正在用C编写。在我的表单上,我有一个TabControl,有七个页面,每个页面都充满了元素文本框和下拉列表。我使用DataReader获取一些信息,填充DataTable,并使用元素的数据绑定 用户可以在这些元素中输入数据,按Save,然后我使用元素的文本字段设置更新查询的参数。例如: updateCommand.Parameters.Add("@CustomerName", SqlDbType.VarChar, 100).Value = CustomerNam

我有一个Winform应用程序,我正在用C编写。在我的表单上,我有一个TabControl,有七个页面,每个页面都充满了元素文本框和下拉列表。我使用DataReader获取一些信息,填充DataTable,并使用元素的数据绑定

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

updateCommand.Parameters.Add("@CustomerName", SqlDbType.VarChar, 100).Value = CustomerName.Text;
我遇到的问题是,一旦我加载表单,所有元素显然都被认为是空的,直到我手动选择每个选项卡。因此,如果在加载表单时立即按Save,则尚未选择的选项卡页上的所有字段都会尝试使用空数据更新。当我选择每个选项卡页时,这些元素现在将正确地发送它们的数据。目前,我已经制定了一个非常糟糕的解决方案,在第一次填充数据时,我会以编程方式选择每个选项卡页,但这是一个不可接受的长期解决方案


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

我不确定是否可以。以下是MSDN的报价:

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


但是,不是让更新代码直接从控件获取值,也许您可以创建一个类来保存用于填充控件的数据表,然后当调用更新代码时,它会向类询问值,而类会检查控件是否已加载,否则它会从数据表获取值;在选择选项卡页之前,不会创建该选项卡页上的元素。我刚刚在表单加载时添加了一个循环,用于选择每个选项卡页,现在它可以正常工作了

foreach (TabPage tp in tabControl1.TabPages)
{
    tp.Show();
}

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

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方法接受一个布尔参数,该参数将允许您创建控件,即使控件不可见。

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

this.tabcontrol1.BindingContext=this.BindingContext


我不确定发生了什么,但是如果控件是数据绑定的,那么应该从BindingSource而不是控件的文本字段中获取值。我在使用BindingSource和TabControls中的多个选项卡时遇到了完全相同的问题谢谢您的回复。我知道你是对的,需要选择页面,虽然我想创建一个基于TabControl的类,但我认为现在在form load.Genius上循环遍历TabPages更容易。我的生活变得轻松多了。简单ftw!