2010-11-21 7 views
1

パネル内にボタンがあります。私はボタンのIDを探していますが、私のコードは機能しません。パネル内に配置したコントロールを見つけるにはどうすればよいですか?

protected void pnl_nocutomer_Load(object sender, EventArgs e) 
{ 
    Button btn; 
    btn = this.FindControl("btn_clear") as Button; 

    Page.LoadComplete += new EventHandler(Page_LoadComplete); 
    string LanguageID = Globals.GetSuitableLanguage(Page); 
    if (LanguageID == "ar") 
    { 
     btn.Text = Globals.Translate("Ok", LanguageID); 
    } 
} 
+2

マークアップを取得しましたか? – Exitos

答えて

1

あなたはどうしようとしますか YourPanelName.FindControl()

2

FindControlは、あなたのケースでは、ページを検索します。しかし、探しているボタンは、ページに含まれているパネルに含まれています。

あなたはそれを見つけるために再帰的な検索を行う必要があります。

1

私はCoddingHorrorにある関数を使用するのが好きです。あなたが探しているコントロールのルートとIDとしてパネルを貼り付けるだけです。以前の答えのように、これはあなたが探しているコントロールを見つけるために再帰を使います。このコードを使用してください。

button btn = (Button)FindControlRecursive(pnl_nocustomer, "btn_clear"); 

private Control FindControlRecursive(Control root, string id) 
{ 
    if (root.ID == id) 
    { 
     return root; 
    } 

    foreach (Control c in root.Controls) 
    { 
     Control t = FindControlRecursive(c, id); 
     if (t != null) 
     { 
      return t; 
     } 
    } 

    return null; 
} 
+0

どのようにこの関数を呼び出しますか? pnl_nocustomerはcontrol_idであるか、コントロール自体か文字列ですか? –

+0

最初のパラメータはコントロール自体であり、2番目のパラメータは探しているIDの文字列です。 – Lareau

0

それは古いスレッドですが、それはそれを見つけるために他人のために、ここでいくつかのノートを置く価値があるように、トップの検索結果です:

x.FindControlは、名前付けコンテナとしてのxを持っているすべてのコントロールを検索します。 これは、パネル内にコントロールがある場合、FindControlがそれを見つけることを意味します。 FindControlは、一致するIDを持つコントロールがx.Controlsにリストされているコントロールだけを検索することに限定されません。 FindControlは、INamingContainerである子(または子の子)コントロール内を見ない再帰的な検索を効果的に行うと考えることができます。

INamingContainerは、コンテンツをテンプレートとして使用して、コントロール内にコントロールを1つ、または複数作成するコントロールです。例えばリピータなど

リピータ内にコントロールがある場合、Page.FindControlはそれを見つけられません。上記の再帰関数は、Pageをルートとして使用して、リピータテンプレートからそのコントロールの最初のインスタンスを検出します。 1つのリピーターしか持たないことが分かっている場合は、確認してください(ページ全体ではなく、リピーターコントロールを再帰的に検索することもできます)

ページではない命名コンテナ内にある場合は、イベントの「送信者」からリファレンスを取得する方がよい後のコントロールのOnLoad。 "送信者"がネーミングコンテナ(リピータテンプレート)である場合、その上のFindControlを使用して、後続のコントロールに移動することができます。

リピーターがない場合は、元のポスターが実際に間違いを犯している可能性があります(ASCXファイルではbtn_clearという名前ではありません)。マークアップを見る必要があります。このケースではおそらく彼らがフォローアップしなかった理由でしょうが、FindControlがPanel内でコントロールを見つけられないと思う人はおそらくこのページを見つけて、このフォローアップを投稿したのです。

0

runat = "server"を特定の要素に追加

関連する問題