asp.net - 动态添加的链接按钮在单击按钮时消失,留下空列

标签 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 外部的按钮以打开一个窗口以将新项目添加到网格时,链接按钮就会消失。但该专栏仍然存在。

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

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

最佳答案

发生这种情况是因为下次回发时不会调用 GridView 的 OnRowDataBound 事件。发生这种情况是因为默认情况下 GridView 的 viewstate 设置为 true,即 Gridview 的 EnableViewState 属性为 true。当 ViewState 打开时,Gridview 会存储来自同一 View 的数据,并且不会调用 OnRowDataBound 事件。此外,此时 View 状态将不会应用于您的 linkBut​​tons,因为它们不是在 page_load 中创建的。

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

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

或者您也可以将 page_Load 中的 GridView 绑定(bind)为:

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

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


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

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

这将为您带来在动态控件中使用 View 状态的好处。尽管 View 状态通常在 Page.Load 事件之前恢复,但如果您在 PageLoad 事件的处理程序中创建控件,ASP.NET 将应用所有 View 状态信息它在 PageLoad 事件处理程序结束后具有。

关于asp.net - 动态添加的链接按钮在单击按钮时消失,留下空列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18567872/

相关文章:

asp.net - 自己动手模态的 CSS 修复

c# - Devexpress GridView 条件单元格格式

c# - 动态 ascx 用户控件的空引用异常

.net - 动态 ASP.net Web 窗体

c# - 基于用户回发的动态控件

c# - 使用 JObject 所需的库名称是什么?

asp.net - HttpContext.Current.Session 为 null + OWIN

c# - 为 asp.net 标签添加样式

javascript - Gridview 在 javascript 中单击按钮时进行行验证

c# - Gridview EmptyDataText ="No data"- 如何向文本 'No data' 添加样式