在TabControl中循环控件

4
我正在寻找一种方法来循环遍历选项卡控件中的控件。例如,我有一个选项卡控件,其中包括以下选项卡:Cars、Pets、Admin。每个选项卡上都有几个控件,用于显示/编辑/保存数据等等。在“保存”按钮上,我想循环遍历该特定选项卡的控件,以检查是否填写了所有必填字段。因此,如果我在Cars选项卡上单击“保存”,我希望仅循环遍历Cars选项卡上的控件,而不是Pets或Admin选项卡上的控件。如何实现这个结果?
7个回答

12

如果要循环遍历TabControl的控件,您需要使用Controls属性。

这里有一个关于TabControl的MSDN文章

示例:

        TabPage page = aTabControl.SelectedTab;

        var controls = page.Controls;

        foreach (var control in controls)
        {
            //do stuff
        }

为什么要使用SelectedTab而不是通过名称引用它呢? 像这样写会更高效: foreach (var control in CarsTab.controls) { } }``` - undefined

8
我认为需要注意的是,一般来说,您应该采用更加结构化的方法来设计您的应用程序。例如,不要在三个选项卡页面上放置所有控件,而是在每个选项卡页上包含一个单独的用户控件,如CarUserControlPetUserControlAdminUserControl。然后每个用户控件都知道如何创建相应的数据结构,这样您就不必手动使用选项卡之间的循环等方法将它们合并在同一抽象级别上。
这种关注点的分离将使您更容易理解程序,并且是编写可维护代码以备将来职业发展的良好实践。

我将Joseph的回答标记为答案,但因为你提供了有价值的建议,所以给了你+1。谢谢! - Sesame
我们使用这种方法,利用一个定制的UserControl作为容器,当用户方便时,可以通过容器内置的按钮单击将其加载到自己的独立窗口中。也可能有第三方控件可以实现这一点。 - PaulR

2

以下是我编写的应用程序中,想要获取特定选项卡中的DataGridView的示例。

TabPage pg = tabControl1.SelectedTab;

// Get all the controls here
Control.ControlCollection col = pg.Controls;

// should have only one dgv
foreach (Control myControl in col)
{
    if (myControl.ToString() == "System.Windows.Forms.DataGridView")
    {
        DataGridView tempdgv = (DataGridView)myControl;   
        tempdgv.SelectAll();
    }
}

1
为什么这么复杂?同时,您可以使用“if(myControl is DataGridView)” - Philip Wallace
这有什么复杂的?它有多个选项卡,我想要选项卡中的特定控件(即DGV)。 - user195488
也许“复杂”这个词用错了。你为什么要有pg和col?它们没有被重复使用... - Philip Wallace
@Brian - 我不确定,如果你只是使用了tabControl1.SelectedTab.Controls会怎样?无论如何,我的原始观点都是无关紧要的,因为我们看不到整个代码片段。 - Philip Wallace
你的代码里面不是漏了一个GetType()吗?应该改成这样:"if (myControl.GetType().ToString() == "System.Windows.Forms.DataGridView")"。 - Mike Gledhill
显示剩余4条评论

1

Controls属性是解决问题的方法...

foreach(Control c in currentTab.Controls)
{
    if(c is TextBox)
        // check for text change
    if(c is CheckBox)
        //check for check change
    etc...
}

0

TabControl有一个SelectedTab属性,所以你可以像这样做:

foreach(Control c in tabControl.SelectedTab.Controls)
{
    //do checks
}

0
foreach (Control c in this.tabControl1.SelectedTab.Controls)
{
  // Do something
}

0

我也有需要禁用或启用选项卡中的控件。不过,我必须更加通用化。希望这能帮助到大家,而且我没有犯错。

    private void toggleControls(Control control, bool state)
    {
        foreach (Control c in control.Controls)
        {
            c.Enabled = state;
            if (c is Control)
            {
                toggleControls(c, state);
            }
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接