在RowDataBound中以编程方式创建的事件没有触发

本文关键字:事件 创建 RowDataBound 编程 方式 | 更新日期: 2023-09-27 18:17:26

我有一个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移出时返回,但文本更改事件不会触发。我遗漏了什么吗?

在RowDataBound中以编程方式创建的事件没有触发

您应该更改实现,这样您就不会在数据绑定时添加事件处理程序,这将使您陷入页面生命周期中的各种问题。

相反,您可以声明性地绑定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属性在事件处理程序中进行检查。