数据网格从多个 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 状态将不会应用于您的 linkButtons
,因为它们不是在 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
事件都会被调用,因此 LinkButtons
每次都可用。
注意: 将 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/