我有一个winforms TabControl,我试图遍历每个标签中包含的所有控件。有没有办法在and
循环中添加foreach
或者是否可以评估多个项目组?例如,这就是我想要做的事情:
foreach (Control c in tb_Invoices.Controls and tb_Statements.Controls)
{
//do something
}
OR
foreach (Control c in tb_Invoices.Controls, tb_Statements.Controls)
{
//do something
}
这是可能的,如果没有,那么下一个最好的东西是什么?我是否需要使用for
循环?
答案 0 :(得分:4)
foreach(TabPage page in yourTabControl.TabPages){
foreach(Control c in page.Controls){
LoopThroughControls(c);
}
}
private void LoopThroughControls(Control parent){
foreach(Control c in parent.Controls)
LoopThroughControls(c);
}
答案 1 :(得分:3)
最终解决方案:
var allControls = from TabPage p in tabControl.TabPages
from Control c in p.Controls
select c;
原始答案 - 使用Concat
:
var allControls = tb_Invoices.Controls.Cast<Control>()
.Concat(tb_Statements.Controls.Cast<Control>();
BTW我认为最好在这里使用简单的非通用ArrayList
ArrayList allControls = new ArrayList();
allControls.AddRange(tb_Invoices.Controls);
allControls.AddRange(tb_Statements.Controls);
答案 2 :(得分:0)
我喜欢做的是:
var list = new List<T>();
list.AddRange(list1);
list.AddRange(list2);
list.AddRange(list3);
list.AddRange(list4);
foreach (T item in list)
{
.....
}
答案 3 :(得分:0)
您可以通过递归写入来使用一个foreach循环。这将确保循环遍历表单中所有类型的所有控件。
private void LoopAllControls(Control YourObject)
foreach(Control c in YourObject.Controls)
{
if(C.Controls.Count > 0)
LoopAllControls(c.Controls);
//your code
}
答案 4 :(得分:0)
你可以这样做:
public static void ForAllChildren(Action<Control> action,
params Control[] parents)
{
foreach(var p in parents)
foreach(Control c in p.Controls)
action(c);
}
叫做:
ForAllChildren(x => Foo(x), tb_Invoices, tb_Statements);
虽然在这种情况下你可以使用嵌套的foreach
:
foreach (var p in new Control[] { tb_Invoices, tb_Statements })
foreach (Control c in p.Controls)
Foo(c);
类似地,循环遍历任何非泛型IEnumerable
中所有项目的通用解决方案可能是(虽然有点像使用大锤来敲钉子):
public static void ForEachAll<T>(Action<T> action,
params System.Collections.IEnumerable[] collections)
{
foreach(var collection in collections)
foreach(var item in collection.Cast<T>())
action(item);
}
叫做:
ForEachAll<Control>(x => Foo(x), tb_Invoices.Controls, tb_Statements.Controls);
答案 5 :(得分:0)
如果您无法使用LINQ(如使用.NET2),我建议您使用此方法:
public static IEnumerable<T> Concat<T>(params IEnumerable<T>[] args)
{
foreach (IEnumerable<T> collection in args)
{
foreach (T item in collection)
{
yield return item;
}
}
}
现在你有了一个泛型函数,你可以使用任何可枚举的。你的循环可能如下所示:
foreach (Control c in Concat(tb_Invoices.Controls, tb_Statements.Controls))
{
//do something
}
简单,便宜且富有表现力!
编辑:如果您的收藏集未实现IEnumerable<T>
但只实现IEnumerable
,则可以添加一个接受后者的重载。除了T
在嵌套循环中更改为object
之外,其他所有内容都保持不变。