2011-12-08 38 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

行数据绑定是否在回发中被触发?事件需要在回发时绑定,因为它们是从后面的代码设置 – WraithNath

+0

是否评估了if循环? – V4Vendetta

回答

1

你应该改变的实施,让你不会在数据绑定,这将让你在各种与页面生命周期的问题时添加事件处理程序。

相反,你可以在AutoPostBack属性声明绑定和刚刚成立事件处理程序有作为。

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

事件只会自动闪光(即当输入失去焦点)时IsAuto ==真,但是当用户点击同一行中的另一个按钮,然后在输入文本它可能仍然大火被改变。因此,你需要在事件处理额外的检查:

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

注意,通过声明的方式绑定,我们需要少担心页面生命周期,我们可以使用输入的绑定属性在事件处理程序对证。

相关问题