2009-04-20 10 views
2

私はページのIEで私のボタンを見つけるために、OnLoadイベントににFindControlを持っている:私のaspxページのFindControlはバインドサーバータグでは機能しません。なぜですか?

protected override void OnLoad(EventArgs e) 
{ 
    DataBind(); 
    control button = Page.FindControl("myButton"); 
} 

私が合格したときに、私が唯一、すべての作品、これを持っている場合、私は

<asp:Button runat="server" ID="myButton" /> 

を持っていますOnLoad、ボタンはnullではなく、私は欲しいものを実行することができます。問題は、自分のaspxに動的テキストを追加するときです。

<asp:Button runat="server" ID="myButton" Text='<%# "Here is my dynamic text pulled from a XML" %>' /> 

次にFindControlは何も見つからず、ボタンがnullです。

バインディングサーバータグをaspxに追加することは、何かを遅らせることを想定していませんか? Pageオブジェクトを調べると、Controlsコレクションにいくつかのコントロールがありますが、myButtonを見つけることができません。

私は何を間違えているのですか?

EDIT

人々は私のコード例では、私の実際のコードであることを考えているようだが、それないが、だから私は、私はネストされたコントロールを持っているために必要と私はそれを直接アクセスすることはできませんので、私はにFindControlを使用します私は入れているダイナミックテキストが他のページのaspxでオーバーライドできるContentTemplateの内部にあるので、私はバインディングを使用します。

私が質問した質問は、新しく実装されたビヘイビアであるビヘイビアを実装しているため、FindControlがnullを返す問題を追跡したという事実に、より具体的でした。

コード例を改善することは、私のaspxページに<%#%>タグを置くと、OnLoadイベントのFindControlがnullを返すという事実に対する解答または説明ではありません。

EDIT 2

だけではバインドタグは、それらを埋めるために)犯人が、DataBindを(ではないようです。バインドタグを持っているかどうかにかかわらず、FindControlの前にDataBind()を置くとmyButtonがnullになります。コード例の修正が行われました。

答えて

1

In here MSDN氏は述べている:

のPreRender:その DataSourceIDプロパティが設定されているその DataBindメソッドを呼び出します各データバインドコントロール。

データバインドコントロールのDataSourceIDを使用していないようですが、FindControlコードをPreRenderイベントに移動すると役立ちます。

+0

これは正しく、Pre-Renderのコードを動かすと、DataBindを呼び出す前にmyButtonが見つからないため、テンプレートDataSourceにデータが設定されていないことを意味します。 DataBindを呼び出さないと、コントロールはviewstateからリロードされ、そのためにnullではありません。私のFindControlの前に私のテンプレートのDataSourceを再適用するか、Pre-Renderの後のFind-Controlを動かして問題を解決してください。コード18の問題に似ていましたが、それが何であったかは分かりませんでした。どうも –

0

あなたのページ上のボタンにアクセスしたい場合は、直接として、ボタンを参照することができます -

this.myButton 

そして限り値を割り当てることは懸念しているとして、あなたは、サーバーのコード内でこのようにそれを行うことができます - あなたは例えばのために、コントロールのデータバインディングされている場合

this.myButton.Text = "Dynamic Text"; 

<%#XYZ%>だけを使用していますDataGrid、GridViewなど

+0

なぜこのような状況で「this」を使用していますか? – TStamper

+0

質問のタイトルとは無関係に、継承のためにFindControlを使用していますが、コントロールに直接アクセスすることはできません。例は、完全なコードではなく、私がトレースした問題を示すことでした。 FindControlと<%# %>タグの特定の組み合わせに問題を絞り込んだので、私が提示したもの以外のものを人々が指摘することを望んでいませんでした。 –

0

オーバーライドでは、最初にメソッドのbase.OnLoad(e)を呼び出す必要はありませんか?

+0

私は自分のコードでbase.Onloadを呼び出しますが、提供された例は自分の問題の説明を完了するだけでした。私はこれを明確にするために私の質問を編集しました。 –

+0

それから完全な例を投稿することができます。 FindControlは、テンプレート結合コントロールではうまく機能します。 – Mcbeev

+0

asp:コンテンツは、私が知る限り、テンプレートバインドコントロールではありません。完全な例は、6ページの間に2000行のコードがあり、簡単にするために狭くする必要があります。私のコード例は最も簡単な説明です。 –

1

Page.FindControl()メソッドは、Pageに関連付けられているコントロールのimediateコレクションのみを検索します。コントロールツリー全体を再帰的に繰り返すことはないので、ボタンが別のコントロール内に含まれていれば、そのボタンは見つかりません。格納しているコントロールでFindControlメソッドを呼び出す必要があります。

+0

FindControlはDataBind()を使わないと正しく動作します。ページは私のコントロールを含んでいます。 –

関連する問題