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

C# 获取类型的所有控件并更改其属性,c#,winforms,reference,controls,C#,Winforms,Reference,Controls,在我的软件中,我有一个选项卡control,我想使用foreach(例如)搜索特定类型的所有控件,并更改其中的一些属性。 现在当我这样做的时候: Control ctrl; ctrl = My_CheckedListBox; ((CheckedListBox)ctrl).SetItemChecked(0, false); 它工作正常,复选框都未选中,没有问题。但当我使用foreach时,他们不会: foreach (Control item in ModuleTab.Controls)

在我的软件中,我有一个
选项卡control
,我想使用
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);
                }    
          }
    }

有什么帮助吗?

所以我解决了!乔恩·斯基特是对的。
TabControl
中的选项卡不包含我要查找的控件,因为它们都在
GroupBox
中! 我在
GroupBox
中搜索它们,它们就在那里。
复选框
未选中,一切正常

@Jon Thx的“观察”提示。我让程序使用
消息框
在选项卡中显示可用的
控件
,这就是我解决问题的方法。Thx同样适用于删除其答案的用户,因为他将我引入type()的
方法。这确实使代码看起来更好:

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);
                    }
                }
            }
foreach(ModuleTab.Controls.OfType()中的var groupbox)
{
foreach(groupbox.Controls.OfType()中的变量项)
{
对于(int i=0;i
foreach(模块选项卡控件中的控件项)
{
if(item.GetType()==typeof(CheckedListBox)))
{
对于(int i=0;i
不,我认为您误诊了问题,同时误解了
ref
的含义。(请参阅)这不像是
foreach
在复制对象。你到底在观察什么?你能展示一个简短但完整的程序来演示这个问题吗?(作为可读性提示:如果您只使用
As
,或者在
if
语句中将结果存储为局部变量时强制转换一次,那么您的代码会更干净。)问题是,我希望找到所有
CheckedListBox
控件,并取消选中其中的所有复选框。相信我,我在发布这篇文章之前使用了as,但是
as
也按照我的想法复制了这个对象。而且:如果我像你建议的那样“将结果存储为局部变量”,我也会复制控件,并且无法更改它的属性。这不能告诉我们你观察到了什么,也不能给我们提供一个我们可以用来重现问题的示例。请阅读我真的不明白你说的“观察”是什么意思!运行此代码时看到的内容,与预期看到的内容进行比较。“它不起作用”并没有告诉我们这一点。
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);
                    }
                }
            }
foreach (Control item in ModuleTab.Controls)
{
  if (item.GetType() == typeof(CheckedListBox)))
   {
    for (int i = 0; i < item.Items.Count; i++)
        {
         item.SetItemChecked(i, false);
        }
   }
}