为什么在页面回发时会触发GridView.RowCreated事件

时间:2013-07-17 08:01:31

标签: asp.net gridview

全部,我使用RowCreated事件来填充Row的每GridView个内容。但是当我点击任何可能触发页面回发的服务器控件RowCreated时,我发现GridView事件Asp.net Button被触发。 它会导致e.Row.DataItem不可用的问题(null)。

代码如下所示。

    protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            SomeObject mapItem = (SomeObject)e.Row.DataItem;//DataItem is null when postback.
        }         
    }

我确信在回发时我没有将DataTableList<T>GridView绑定。 经过研究。我还发现是否将代码移动到RowDataBound事件。一切都好。问题消失了。我只是不知道为什么。希望可以有人帮帮我。谢谢。

2 个答案:

答案 0 :(得分:2)

根据MSDN

  

在可以渲染GridView控件之前,必须使用GridViewRow对象   为控件中的每一行创建。 RowCreated事件被引发   何时创建GridView控件中的每一行。这使您能够   提供执行自定义例程的事件处理方法   在发生此事件时将自定义内容添加到行中。

另请查看以下链接,了解其发生的原因:

GridView event raise unexpectedly after postback

答案 1 :(得分:1)

RowCreated专注于解析Gridview行的定义并创建Gridview行的控制结构,

RowDataBound专注于绑定数据到RowCreated中创建的行控件。

在init和postback情况下也会自动调用RowCreated,但RowDataBound仅在调用DataBind时调用。

每次网格绑定数据时,RowCreated事件都会每次调用。

您是否在页面加载时绑定了gridview?如果是这种情况,则每次回发都会触发RowCreated事件。要避免这种情况,请检查!IsPostback来控制它并管理您的gridview绑定。在大多数情况下,每个人(包括Microsoft)都会使用RowDataBound事件代替RowCreated。

希望有所帮助:)