动态添加链接按钮在按钮单击时消失,留下空列

时间:2013-09-02 07:35:30

标签: asp.net gridview dynamic-controls

数据网格从几个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

一切正常。

但是当我点击gridview外部的按钮时,要打开一个窗口以向网格添加新项目,链接按钮就会消失。但专栏仍在那里。

如果我只关闭新窗口而不保存新数据(这将提示网格重新绑定),则列保持为空。我不得不重新加载gridview以显示链接按钮。

是因为链接按钮是在rowdatabound上创建的吗?我该怎么解决这个问题?

1 个答案:

答案 0 :(得分:2)

这种情况正在发生,因为GridView的OnRowDataBound事件未在下一次回发时调用。发生这种情况是因为GridView的默认视图状态设置为true,即Gridview的EnableViewState属性为true。启用ViewState时,Gridview会存储相同的数据,并且不会调用OnRowDataBound事件。此外,此时查看状态不会应用于linkButtons,因为它们未在page_load中创建。

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

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

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

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

现在,每次回发后,您的OnRowDataBound活动都会被调用,因此LinkButtons每次都会有效。


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

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

这将为您提供在动态控件中使用视图状态的好处。即使视图状态通常在Page.Load事件之前恢复,如果在PageLoad事件的处理程序中创建控件,ASP.NET将应用{{1}之后的任何视图状态信息。事件处理程序结束。