获取类型的所有控件并更改其属性

时间:2015-02-26 09:37:45

标签: c# winforms reference controls

在我的软件中,我有一个TabControl,我想使用Controls(例如)搜索特定类型的所有foreach并更改其中的一些属性。 现在当我做这样的事情时:

Control ctrl;
ctrl = My_CheckedListBox;
((CheckedListBox)ctrl).SetItemChecked(0, false);

它工作正常,复选框全部取消选中,没问题。但是当我使用foreach时他们不会:

foreach (Control item in ModuleTab.Controls)
    {
      if (item is CheckedListBox)
          {
             for (int i = 0; i < ((CheckedListBox)item).Items.Count; i++)
                {
                   ((CheckedListBox)item).SetItemChecked(i, false);
                }    
          }
    }

我知道这是因为item不是Control而是一个对象。我想知道是否有类似的东西:

foreach (Control ref item in ModuleTab.Controls)

任何帮助?

2 个答案:

答案 0 :(得分:0)

所以我解决了! Jon Skeet是对的。 TabControl中的标签不包含我要查找的控件,因为它们都在GroupBox中! 我在GroupBox搜索了他们,他们在那里。 CheckBoxes未经检查,一切都完美无缺。

@Jon Thx的“观察”提示。我让程序使用Controls向我显示标签中可用的MessageBox,这就是我解决它的方法。对于删除了他的答案的用户也是如此,因为他引诱我使用OfType<>()方法。这真的使代码看起来更好:

foreach (var groupbox in ModuleTab.Controls.OfType<GroupBox>())
            {
                foreach (var item in groupbox.Controls.OfType<CheckedListBox>())
                {
                    for (int i = 0; i < item.Items.Count; i++)
                    {
                        item.SetItemChecked(i, false);
                    }
                }
            }

答案 1 :(得分:0)

foreach (Control item in ModuleTab.Controls)
{
  if (item.GetType() == typeof(CheckedListBox)))
   {
    for (int i = 0; i < item.Items.Count; i++)
        {
         item.SetItemChecked(i, false);
        }
   }
}