1

当我在GridView.ROWDATABOUND事件中动态创建按钮时,我在 asp.net 4.5 中遇到错误。

按钮代码:

Dim btn1 As New Button()
btn1.ID = "btn1"
btn1.Width = "50"
btn1.Text = "Edit"
btn1.CssClass = "AdminPageBtn"
btn1.CommandName = "Edit"
btn1.CommandArgument = "Edit"
btn1.Enabled = True

e.Row.Cells(e.Row.Cells.Count - 1).Controls.Add(btn1)

我也在使用 AJAX 4.0,带有脚本管理器和更新面板。

该按钮执行以下方法

Protected Sub gvwRoutes_RowEditing(ByVal sender As Object, 
                      ByVal e As System.Web.UI.WebControls.GridViewEditEventArgs)
                Handles gvwRoutes.RowEditing
End Sub

执行的时候报错:

Failed to load viewstate. The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request. For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request.

需要一个解决方案..!

4

1 回答 1

2

如果您尝试将控件添加到控件集合的中间位置,那么您肯定会遇到视图状态问题。根据Asp.net 中动态控件的 MSDN规范

Inserting a dynamic control somewhere other than the end of the Controls collection 
can cause a corrupted view state

因此,可能的解决方案是Placeholder在您可以添加动态控件的页面中使用。这将在 Control 集合的中间保留索引,并将处理 View 状态。由于新添加的控件将具有来自占位符控件的视图状态。

于 2013-10-14T11:26:51.987 回答