FindControlメソッドのエラーと解析

3865 ワード

ASP.NETのControlには、ID(UniqueIDでもClientIDでもないことに注意)に基づいてControlが存在するネーミングコンテナで対応するコントロールを探すFindControlメソッドがありますが、実際の使用には多くの誤解や落とし穴があります.以下、個人的な理解について説明します.
1.FindControlメソッドが探す範囲は、指定されたControlの子孫コントロールであると考えられる.
1      <form id="form1" runat="server">
2 <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
3 <asp:Panel ID="Panel1" runat="server">
4 <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
5 <asp:Button ID="Button1" runat="server" Text="Button" />
6 </asp:Panel>
7 </form>

上のコードのように、バックグラウンドはPanel 1を使用します.FindControl(「Button 1」)は、このような範囲が小さいと効率が向上すると考えているが、実際にはTextBox 1を用いる.FindControl(「Button 1」)も同様に見つかります.前述したように、FindControlメソッドは、IDに基づいてControlが存在するネーミングコンテナ内で対応するコントロールを探す.TextBox 1が実行するとき.FindControl(「Button 1」)の場合、ASP.NETはまずTextBox 1を取得する.NamingContainerは、ページ自体(最後に生成されたxxxx_aspxクラスのインスタンス)の値で、対応するIDのコントロールを下に再帰的に探しているので、Button 1も同様に見つかります.
同じようにTextBox 1を使うとFindControl(「Label 1」)もLabel 1を見つけることができます.
2.なぜか分からない.FindControlメソッドではGridViewのコントロールが見つかりません.
FindControlメソッドでは、本ネーミングコンテナの下でのみ検索され、他のネーミングコンテナには検索されません.ネーミングコンテナ(NamingContainer)はページ自体だけでなく、GridView、DataListItem、RepeaterItem、UserControl、MasterPageなど多くのコントロールがあり、これらはINamingContainerインタフェースを継承しています.これらの1つの顕著な特徴は、そのサブコントロールのUniqueIDおよびClientIDが一般的にID(最上位のページオブジェクトを除く)と異なることである.
3.FindControlは稼働効率が悪いと思われる.
実はASP.NET実行時にaspx、ascx、masterなどのファイルラベル構造を分析し、Domのようなコントロールツリーを生成する.一般的に、ツリーに対するクエリーの操作効率は比較的高く、特に問題の規模があまり大きくない場合.一般的に、実際のページのコントロールの数は数千に達することはできません.また、このネーミングコンテナを越えることはできません.これらの要因は問題の規模を制限しています.だからFindControlの効率は悪くない.