2017-05-30 6 views
0

テーブルにコントロールをいくつか追加し、そのテーブルをパネルに追加しました。今、別の方法でこれらのコントロール(テキストボックス、ドロップダウンリストなど)にアクセスしたいと思います。 私はevudently私がテーブルに、最終的にパネルに追加何のコントロールを与えていないLINQを使用してパネル内のコントロールを選択

List<Control> panelControls = (from pControls in _controlsPanel.Controls.OfType<Table>(). OfType<TableRow>().OfType<TableCell>().OfType<Control>() 
               .Where(ctrl => (ctrl is TextBox || ctrl is DropDownList)) 
              select pControls).ToList(); 

としようとしています。

コントロールをテーブルにPanelに追加するか、コントロールを取得する方法がありますか?

すべてのコントロールがテーブルにあるので、コントロールをパネルに明示的に追加することは冗長に思えたので、私は考えました。しかし、私は間違っているかもしれません。どうか明らかにしてください。

+0

。 OfType ().OfType ().OfType ()=>それらは間違っています。あなたは.Itemsまたは.Controlsする必要があります – hiule

答えて

0

あなたは私の頭が傷ついているquery and method syntaxを混ぜたようです。私の答えの目的のために、私はメソッド構文に固執するでしょう。

LINQでは、単一のリスト(pControls)から始めて、リストをフィルタリングする複数のOfTypeWhereという句を適用します。したがって、あなたは「テーブルでありテーブル行であり、テキストボックスまたはドロップダウンリストであるすべてのコントロールを私に渡してください」と言っています。テーブルとテーブルの両方の行が同時に存在するオブジェクトはないので、そこに空のリストがあります。

代わりに階層を少し歩かなければなりません。リスト(テーブルなど)を生成し、そのリスト内のアイテムを使用して別のリスト(それらのテーブルに属するコントロール)を取得する必要があります。

あなたが単一のパネル上のすべてのコントロールを取得したい場合は、ちょうどあなたが単一のテーブルからすべてのコントロールを取得したい場合は、最初のテーブルへの参照を取得

var panelControls = pControls.Controls; 

を使用しています。あなたのテーブルがMyTable命名されている場合たとえば、:

var table = pControls.Controls.OfType<Table>().Where(c => c.ID == "MyTable").First(); 

その後のコントロールを取得するには、その参照を使用します。

var controls = table.Controls; 

たり、1つのステートメントでそれをすべてしたい場合:

var controls = pControls.Controls 
         .OfType<Table>() 
         .Where(c => c.ID == "MyTable") 
         .First() 
         .Controls; 

そのリストをフィルタリングして、テキストボックスやドロップダウンリストを取得することができます。

var list = controls.OfType<Control>().Where(c => c is TextBox || c is DropDownList); 

それとも、あなたは本当に1つのステートメントでそれをすべてしたい場合:

var list = pControls.Controls 
        .OfType<Table>() 
        .Where(c => c.ID == "MyTable") 
        .First() 
        .Controls 
        .OfType<Control>() 
        .Where(c => c is TextBox || c is DropDownList); 
+0

ジョンのポインタは非常に近いが、私のテーブルIDが動的に生成され、私はそれを知らない場合はどうですか? – Programmerzzz

+0

テーブルが1つだけの場合は、where句を削除してください。複数のテーブルがあり、それらを結合したい場合は、 'ForEach'アプローチを使用し、各テーブルのコントロールを別々に反復処理する必要があります。 –

+0

私はそれをしましたが、最後の 'where'は定義を持っていないと言って何らかのエラーを出しました。 FYIと同じように、私はTableCellにテキストボックスを追加し、TableCellをTableRowに、TableRowsをTableに、そして最終的にTable to Panelに追加しています。'TextBox/DropDowns - > TableCell - > TableRow - > Table - > Panel' – Programmerzzz

関連する問題