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 は、コントロール プロパティの初期化または読み取り用です。Load は、通常、プロパティ (並べ替え方向など) を設定する場所です。

基本的に、あなたViewStateはまだロードされてPage_Initいません。そのため、 でコントロール プロパティを変更するとInit、一部のプロパティが ViewState から入力されます。これにより、ページがLoadイベント (各サーバー コントロールのイベントを再帰的に呼び出すLoad) を実行すると、予期しない動作が発生します。

MSDN: ASP.NET ページ ライフ サイクルの概要で、この (やや紛らわしい) トピックについてすべて読むことができます。

于 2012-08-13T15:15:41.130 に答える