2011-12-08 16 views
1

私はデータベースから読み込まれ、テキストボックスを含むGridViewを持っています。コードの背後では、行のフィールドがif文と一致する場合にのみ、各行のテキストボックスを特定のイベントに登録したいと考えています。プログラムで作成されたRowDataBoundのイベントは発生しません

だから私は、次のしている:

protected void grdRates_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    TextBox txt = (TextBox)e.Row.FindControl("txtValue"); 
    DataRowView dataView = (DataRowView)e.Row.DataItem; 
    if ((bool)dataView["isAuto"]) 
    { 
     txt.AutoPostBack = true; 
     txt.TextChanged += new EventHandler(txt_TextChanged); 
    } 
} 

protected void txt_TextChanged(object sender, EventArgs e) 
{ 
    //Other stuff here 
} 

を問題は、テキストが発火することはありませんイベントを変更し、ある - 彼らはテキストボックスの外に移動したときにAutoPostBackプロパティはバックページの記事として、設定されているが、テキスト変更イベントは発生しません。私はここに何かを逃していますか

+0

ポストバックに行databoundが発生しますか?ポストバック時にイベントをバインドする必要があります。 – WraithNath

+0

のコードから設定されているので、ifループが評価されていますか? – V4Vendetta

答えて

1

データバインディング時にイベントハンドラを追加しないように実装を変更する必要があります。これにより、ページライフサイクルのあらゆる問題が発生します。

代わりに、AutoPostBackプロパティを宣言的にバインドし、そこにイベントハンドラを設定することもできます。

<asp:TextBox ID="SomeInput" runat="server" ... 
    AutoPostBack='<%# (bool)Eval("IsAuto")' 
    OnTextChanged="SomeInput_TextChanged" /> 

イベントは自動的にのみ火災(すなわち、入力フォーカスを失ったとき)場合IsAuto == trueがしますが、ユーザが同じ行にある別のボタンをクリックし、入力中のテキストが変更されたとき、それはまだ発射できます。だから、イベントハンドラ内の余分なチェックが必要になります宣言結合することによって、我々はページのライフサイクルについてはあまり心配する必要があり、我々はイベントハンドラ内に対してチェックするために、入力のバウンドプロパティを使用することができることを

protected void SomeInput_TextChanged(object sender, EventArgs e) 
{ 
    TextBox input = (TextBox)sender; 
    if(input.AutoPostBack) 
    { 
     // Other stuff here 
    } 
} 

お知らせ。

関連する問題