6

winforms TabControl があり、各タブに含まれるすべてのコントロールを循環しようとしています。ループに追加する方法はありandますforeachか、それともアイテムの複数のグループを評価することはできませんか? たとえば、これは私がやりたいことです:

foreach (Control c in tb_Invoices.Controls and tb_Statements.Controls)
{
    //do something
}

また

foreach (Control c in tb_Invoices.Controls, tb_Statements.Controls)
{
    //do something
}

これは可能ですか、そうでない場合、次善の策は何ですか? forループを使用する必要がありますか?

4

6 に答える 6

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);
}
于 2013-08-07T13:57:21.480 に答える
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>();

ArrayListところで、ここでは単純な非ジェネリックを使用する方が良いと思います

ArrayList allControls = new ArrayList();
allControls.AddRange(tb_Invoices.Controls);
allControls.AddRange(tb_Statements.Controls);
于 2013-08-07T13:55:41.700 に答える
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);
于 2013-08-07T14:07:30.127 に答える
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

于 2013-08-08T08:28:26.177 に答える
0

再帰的に記述することで、1 つの foreach ループを使用して実行できます。これにより、フォーム内のすべてのタイプのすべてのコントロールを確実にループできます。

private void LoopAllControls(Control YourObject)
   foreach(Control c in YourObject.Controls)
   {
      if(C.Controls.Count > 0)
        LoopAllControls(c.Controls);
      //your code
   }
于 2013-08-07T13:56:54.923 に答える
0

私がやりたいことは次のとおりです。

var list = new List<T>();
list.AddRange(list1);
list.AddRange(list2);
list.AddRange(list3);
list.AddRange(list4);

foreach (T item in list)
{
    .....
}
于 2013-08-07T13:54:42.443 に答える