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

时间:2011-12-08 10:35:38

标签: c# asp.net

我有一个从数据库填充的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时回发,但文本更改事件不会触发。我在这里错过了什么吗?

1 个答案:

答案 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属性在事件处理程序中进行检查。