【问题标题】:get all controls of a type and change their properties获取一个类型的所有控件并更改它们的属性
【发布时间】:2015-02-26 09:37:44
【问题描述】:

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

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)

有什么帮助吗?

【问题讨论】:

  • 不,我认为您误诊了问题 - 同时误解了 ref 的含义。 (参见pobox.com/~skeet/csharp/parameters.html)这不像foreach 正在复制对象。你实际上在观察什么?你能展示一个简短但完整的程序来演示这个问题吗? (作为可读性提示:如果您只使用 as 或强制转换 once 将结果作为局部变量存储在您的 if 语句中,您的代码会更简洁。)
  • 问题是我想找到所有CheckedListBox控件并取消选中其中的所有复选框。相信我,我在发布之前使用过,但 as 也会像我想的那样复制对象。并且:如果我按照您的建议“将结果存储为局部变量”,我也会复制控件并且无法更改它的属性。
  • 这并没有告诉我们你观察到了什么,也没有给我们一个可以用来为自己重现问题的例子。请阅读tinyurl.com/stack-hints
  • 我不太明白这里的“观察”是什么意思!
  • 您在运行此代码时所看到的,与您预期看到的相比。 “它不起作用”并没有告诉我们这一点。

标签: c# winforms reference controls


【解决方案1】:

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

@Jon Thx 用于“观察”提示。我让程序使用MessageBox 在选项卡中向我显示可用的Controls,这就是我解决它的方法。也感谢删除他的答案的用户,因为他劝我使用OfType&lt;&gt;() 方法。这确实让代码看起来更好:

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);
                    }
                }
            }

【讨论】:

    【解决方案2】:
    foreach (Control item in ModuleTab.Controls)
    {
      if (item.GetType() == typeof(CheckedListBox)))
       {
        for (int i = 0; i < item.Items.Count; i++)
            {
             item.SetItemChecked(i, false);
            }
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-11
      • 2011-11-06
      • 1970-01-01
      • 2016-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多