【问题标题】:Loop through controls in TabControl循环遍历 TabControl 中的控件
【发布时间】:2010-12-17 04:43:16
【问题描述】:

我正在寻找一种方法来循环浏览选项卡控件的特定选项卡上的控件。例如,我有一个带有以下选项卡的选项卡控件:

汽车, 宠物, 管理员

在每个选项卡上都有几个用于显示/编辑/保存数据等的控件。在“保存”按钮上,我想循环浏览该特定选项卡的控件以检查是否已填写所有必填字段.

因此,如果我在“汽车”选项卡上并单击“保存”,我只想循环通过“汽车”选项卡上的控件,而不是“宠物”或“管理”选项卡。

怎样才能达到这个效果?

【问题讨论】:

    标签: c# winforms loops foreach tabcontrol


    【解决方案1】:

    我想在我编写的应用程序的特定选项卡中获取 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();
        }
    }
    

    【讨论】:

    • 为什么这么复杂?此外,您可以执行 'if (myControl is DataGridView)'
    • 这有多复杂?它有多个选项卡,我希望选项卡中有一个特定的控件(即 DGV)。
    • 也许复杂这个词用错了。为什么你有 pg 和 col?它们没有被重复使用......
    • 他们是后来的。另外,您可以丢弃。没什么大不了的。
    • @Xaero:无论您是否声明它们,如果您使用较少变量的特定示例,编译器都必须创建一个临时变量来将内存存储在某处。
    【解决方案2】:

    至于循环一个 TabControl 的控件,你需要使用 Controls 属性。

    这是 TabControl 上的 MSDN article

    例子:

            TabPage page = aTabControl.SelectedTab;
    
            var controls = page.Controls;
    
            foreach (var control in controls)
            {
                //do stuff
            }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:
        foreach (Control c in this.tabControl1.SelectedTab.Controls)
        {
          // Do something
        }
        

        【讨论】:

          【解决方案5】:

          Controls 属性是要走的路...

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

          【讨论】:

            【解决方案6】:

            我觉得重要的是要注意,一般来说,您应该对您的应用程序采取更有条理的方法。例如,不是将所有控件都放在三个标签页上,而是在每个标签页上只包含一个 UserControl。 CarUserControlPetUserControlAdminUserControl 例如然后每个用户控件都知道如何创建适当的相应数据结构,因此您不必使用选项卡间循环等在同一抽象级别手动将它们全部组合在一起。

            这种关注点分离将使您更容易推理您的程序,并且是为您未来的职业编写可维护代码的好习惯。

            【讨论】:

            • 我将 Joseph 的回复标记为答案,但为您提供了宝贵的建议 +1。谢谢!
            • 我们使用这种方法,利用一个自定义的 UserControl,它是一个容器,在用户方便时,通过单击容器中内置的按钮,可以将其加载到其自己的单独窗口中。也可能有第三方控件可以执行此操作。
            【解决方案7】:

            我还需要禁用或启用选项卡的控件。不过,我不得不更通用一点。希望它可以帮助人们,我没有犯错

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-01-20
              • 2012-02-10
              • 1970-01-01
              • 2013-11-20
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多