循环访问TabControl中的控件

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

汽车,宠物,管理员

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

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

怎么能达到这个效果?

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

这是关于TabControl的MSDN文章 。

例:

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

我觉得重要的是要注意,一般来说,你应该对你的应用程序采取更有条理的方法。 例如,不是在三个标签页上都有所有控件,而是在每个标签页上包含一个UserControl。 CarUserControlPetUserControlAdminUserControl例如然后每个用户控件都知道如何创建正确的相应数据结构,因此您不必使用inter-tab循环和诸如此类的东西在相同的抽象级别上手动将它们全部混合在一起。

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

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

Controls属性是要走的路……

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

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

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

我还需要禁用或启用选项卡的控件。 我不得不更通用一点。 希望它有助于人们和我没有犯错误

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