我有一个从数据库填充的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时回发,但文本更改事件不会触发。我在这里错过了什么吗?
答案 0 :(得分: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
}
}
请注意,通过声明性绑定,我们需要更少关注页面生命周期,并且我们可以使用输入的bound属性在事件处理程序中进行检查。