4

Windowsフォームにタブコントロールがあり、2つの異なるタブの各要素を繰り返し処理したいと思います。ファイルを開くときは両方の要素をすべて有効にし、ファイルを閉じるときはすべて無効にします。

ただし、コントロールは配列やリストではなく、ControlsCollectionにあるため、これを実現する方法がわかりません。少し前にforeachステートメントについて質問し、ラムダについて少し学びましたが、ここでどのように適用できるかわかりません。

これが私が持っているものです:

List<Control.ControlCollection> panels = new List<Control.ControlCollection>();
panels.Add(superTabControlPanel1.Controls);
panels.Add(superTabControlPanel2.Controls);
foreach(Control.ControlCollection ctrlc in panels){
    foreach (Control ctrl in ctrlc) { 

    }
}

これは、1つのforeachステートメントで可能ですか、それとももっと簡単ですか?

4

4 に答える 4

4

次のように、Linqを使用します。

foreach (var ctrl in panels.SelectMany (x => x.Cast<Control> ())) {
     // Work with the control.
}

重要なのは、 IEnumerableでCast拡張メソッドを使用して、SelectManyで使用できるようにすることです。

于 2012-01-02T00:06:56.357 に答える
1

親コントロールを無効にすると、ネストされたすべてのコントロールも無効になることをご存知ですか?2つのタブパネルを無効にするだけで、すべての子も無効になります。パネルを有効にすると、効果が元に戻ります。

私はこれがあなたの質問に答えないことを知っています、しかしそれはより良い解決策です。

于 2012-01-03T07:29:30.903 に答える
0

私はこのようなことをします:

List<Control> controls = new List<Control>();
controls.AddRange(superTabControlPanel1.Controls.GetControls());
controls.AddRange(superTabControlPanel2.Controls.GetControls());
foreach(Control ctrl in controls){
    //Do something
}

現時点ではVSが手元になく、GetControls()が存在するかどうかわかりません。ただし、一般的な考え方を使用できます。パネルのコレクションの代わりに、コントロールのコレクションを用意し、1つのループでコントロールを反復処理します。

于 2012-01-02T00:12:09.807 に答える
0

私はおそらく2つのコレクションを統合し、GenericList<T>を一緒に使用することを避けます。

var controls = superTabControlPanel1.Controls.Union(superTabControlPanel2.Controls);

foreach (var control in controls) {
  //...
}

または、複数のコレクションをチェーン化することもできます。

var controls = 
  (superTabControlPanel1.Controls)
  .Union
  (superTabControlPanel2.Controls)
  .Union
  (superTabControlPanel3.Controls);
于 2012-01-03T06:59:06.850 に答える