2009-08-03 14 views
4

IDなしでc#(ランタイム)のコントロールを参照するにはどうすればいいですか?c#コントロールとコントロールリファレンスを見つける

たとえば、テーブルが1つあるページがあります。私はxmlhttpを使ってこのページを再帰的に読み込んでいますので、そのIDを使ってテーブルを参照することはできません。 this.Page.Controls[2]の効果がありますか?またはControls["Tables"][0]

私は名前this.Controls.Find("MyTableName", true);を使用してみましたが、ライブラリSystem.Windows.Formsへの参照を必要とする(と思う)けど'using System.'インテリセンスがそれを見ることができないとして、それを追加する方法がわかりません。

私はthis.Controlsではすべてのコントロールをループしていますが、'system.ui.web.control' does not contain a definition for '.Name'だから私はIDのみを検索できます。

これは初めてのことです。私はこのソリューションが非常に簡単であると確信しています。

<asp:Table runat="server"> 
    ... 
</asp:Table> 

ページの定期的なHTML「コントロール」ではありません、彼らは単なるテキストです:ページ上のコントロールを見つけるには、事前

+0

私は本当に理解していないと思います - ページライフサイクルのどの部分で、クライアントサイドにロードされたDOMのリクエストサーバー側を作成するのですか? –

+0

データセットは、一度に読み込むには大きすぎるツリーに表示されるため、ユーザーが展開するとすぐに各ノードを読み込みます。 – Praesagus

答えて

12


おかげで、これは同様に、サーバーコントロールである必要がありますブラウザに送信されます。一方、サーバーコントロールはコードビハインドとやりとりできる実際の.NETクラスです。

コンテナのControlsコレクションを検索するか、ページを再帰的に検索しても、IDなしでこのコントロールのハンドルを取得できます。コントロールのコレクションを再帰的に検索することから始めましょう。

コントロールコレクションは、特定のコントロールの子コントロールであるの即時を参照しています。またはページの直下の子コントロール。これらのコントロールには、の子コントロールがあります。これはメモリ内のツリーを表します。ここ

は、与えられたコントロールからツリーを下に再帰的及びIDの制御を見つけるための方法である:

private Control FindControlRecursive(Control control, string id) 
{ 
    Control returnControl = control.FindControl(id); 
    if (returnControl == null) 
    { 
     foreach (Control child in control.Controls) 
     { 
      returnControl = child.FindControlRecursive(id); 
      if (returnControl != null && returnControl.ID == id) 
      { 
       return returnControl; 
      } 
     } 
    } 
    return returnControl; 
} 

(この回答の範囲を超え、これはextension methodとしてより良い行われます)。

がそのID以外のものによる制御を見つけるには、タイプ別に検索できます。これは、一般的に非常に良いアイデアではないことを

if(someControl is System.Web.UI.WebControls.Table) 

注意。この方法でコントロールを検索しなければならない場合は、大きなパターンではありません。コントロールにIDが必要です。コードで作成されているため、IDを参照する必要があります。

しかし、再帰的にタイプを検索する方法を修正することは簡単です:

private Control FindTable(Control startFrom) 
{ 
    foreach(Control child in startFrom.Controls) 
    { 
     if(child is System.Web.UI.WebControls.Table) 
     { 
      return child; 
     } 
     else 
     { 
      return FindTable(child); 
     } 
    } 
    return null; 
} 

ます。また、この方法の一般的な形式を持つことができます:

private Control FindControl<T>(Control startFrom) 
{ 
    foreach(Control child in startFrom.Controls) 
    { 
     if(child.GetType().IsAssignableFrom(typeof(T))) 
     { 
      return child; 
     } 
     else 
     { 
      return FindControl<T>(child); 
     } 
    } 
    return null; 
} 

あなたは間違いありませんSystem.Windows.Formsをインクルードしたい場合は、単にWinFormsアプリケーションのすべてのコードが含まれている必要があります。そのため、Visual StudioではWebプロジェクトには含まれていません。あなたはそれを必要としません。 System.Web.UIにはWebコントロールのためのすべてがあります。

+0

なぜdownvote? –

+0

私は彼の答えを削除した男からdownvote - 酸っぱいぶどうをなぜ知りませんか?だからあなたのアイデアを型で検索すると、どのような引数型がジェネリック型として定義されるのですか?そうすれば、他の型のコントロールも送信できます。 if(myControlがarg)? – Praesagus

+0

@Praesagus IDの代わりに型でデモを検索するコードを追加しました。私はこの方法を使用することをお勧めしません... –

関連する問題