【发布时间】: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