1

为什么当我尝试使用会话状态设置 GridView 的排序时,突然我的 GridView 不再具有 DataKeys?我所做的只是将以下代码放入我的 Page_Init;

Dim SortDirection As String = Session("SortDir")
Dim sortExpression As String = Session("SortExp")
If Not SortDirection Is Nothing AndAlso Not sortExpression Is Nothing Then
    If (SortDirection = "asc") Then
        GridView1.Sort(sortExpression, WebControls.SortDirection.Ascending)
    Else
        GridView1.Sort(sortExpression, WebControls.SortDirection.Descending)
    End If
End If

但是,如果我将这一点注释掉,那么我的其他方法就不会再崩溃了,因为我的 GridView 现在有了它的 DataKeys。为什么是这样?

更新

当上述代码到位时,这就是停止工作的确切行。

Dim UserID = GridView1.DataKeys(e.RowIndex).Value.ToString

根据调试器 GridView1 有列,但它的 DataKeys 计数为 0。我收到的错误是;

Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
4

1 回答 1

2

您希望在Page_Load(可能在If Not Page.IsPostBack块中)事件中执行这些操作,而不是在Page_Init事件中。Init 用于初始化读取控件属性;负载是您通常设置属性(如排序方向等)的地方。

基本上,您ViewState的尚未加载Page_Init。因此,您修改 中的控件属性Init,然后从 ViewState 中填写一些属性,当您的 Page 执行Load事件(递归调用每个服务器控件的Load事件)时,这会导致意外行为。

您可以在 MSDN 上阅读有关此(有些令人困惑的)主题的所有内容:ASP.NET 页面生命周期概述

于 2012-08-13T15:15:41.130 回答