1

数据网格从几个 xml 文件中读取,因此我动态创建列,并添加了一个模板字段作为最后一列。

使用 RowDataBound 在模板字段中添加一个链接按钮。

Private Sub GridItem_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridItem.RowDataBound
    Try
        If e.Row.RowType = DataControlRowType.DataRow Then
            Dim linkb As New LinkButton
            linkb.Text = "Delete"
            linkb.ID = "LinkDeleteItem"
            linkb.OnClientClick = "javascript:DeleteItem('" & Convert.ToString(e.Row.RowIndex) & "')"
            e.Row.Cells(GridItem.Columns.Count - 1).Controls.Add(linkb)
        End If
    Catch ex As Exception
        lblMessage.Text = ex.Message
    End Try
End Sub

一切正常。

但是,当我单击网格视图外的按钮以打开一个窗口以向网格添加新项目时,链接按钮消失了。但是柱子还在。

如果我只是关闭新窗口而不保存新数据(这将提示网格重新绑定),则该列保持为空。我必须重新加载网格视图才能显示链接按钮。

是因为链接按钮是在行数据绑定上创建的吗?我应该如何解决这个问题?

4

1 回答 1

2

这是因为OnRowDataBoundGridView 的事件在下一次回发时没有被调用。发生这种情况是因为默认情况下 GridView 的 viewstate 设置为 true ,即EnableViewStateGridview 的属性为true。当 ViewState 打开时,Gridview 存储来自相同的数据并且OnRowDataBound不调用事件。此外,此时视图状态不会应用于您linkButtons,因为它们不是在page_load.

尝试EnableViewState为您的 gridview 将属性设置为 false:

<asp:GridView ID="CustomersGridView" 
     OnRowDataBound="CustomersGridView_RowDataBound"
     EnableViewState="false"
  ....  />

或者您也可以将您的GridViewin绑定page_Load为:

protected void Page_Load(object sender, EventArgs e)
    {
       CustomersGrIdView.DataBind();
    }

现在,在每次回发后,您的OnRowDataBound事件都会被调用,因此LinkButtons每次都可用。


注意:在一定程度上将 gridview 的属性设置EnableViewState为 false 可能是一种不好的做法,尤其是在数据使用量很大的情况下。每次绑定gridview也是如此。

使用动态控件时,它们只存在到下一次 postback.ASP.NET 不会重新创建动态添加的控件。如果您下次也需要在回发时重新创建控件,则应在PageLoad事件处理程序中执行控件创建。

这将使您受益于将视图状态与动态控件一起使用。即使视图状态通常在Page.Load事件之前恢复,如果您在事件处理程序中创建控件PageLoad,ASP.NET 将应用它在PageLoad事件处理程序结束后拥有的任何视图状态信息。

于 2013-09-02T08:18:32.927 回答