我有一个GridView从数据库填充,并包括一个文本框。通过后面的代码,我希望将每行上的文本框订阅到某个事件,但仅当该行的某个字段匹配某个if语句时。
所以我有以下内容:
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属性正在设置,当页面从TextBox移出时返回,但文本更改事件不会触发。我遗漏了什么吗?
您应该更改实现,这样您就不会在数据绑定时添加事件处理程序,这将使您陷入页面生命周期中的各种问题。
相反,您可以声明性地绑定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
}
}
请注意,通过声明式绑定,我们不必太担心页面生命周期,并且可以使用输入的bound属性在事件处理程序中进行检查。