数据网格从几个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上创建的吗?我该怎么解决这个问题?
答案 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}之后的任何视图状态信息。事件处理程序结束。