0

一部の ASP.Net コード ビハインドでは、SelectRowから継承するカスタム グリッド コントロールのメソッドを呼び出しますSystem.Web.UI.WebControls.GridView

電話をかける:

If (ProgressGrid.Rows.Count > 0) Then
    ProgressGrid.SelectRow(0)
End If

予想どおり、これによりイベントが生成SelectedIndexChangedされ、ハンドラーによって取得されます。

Protected Sub ProgressGrid_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles ProgressGrid.SelectedIndexChanged
    Using db As New DataContext
        Dim course = (From c In db.CourseResults
         Where c.MemberID = MemberID AndAlso c.ResultID = CInt(ProgressGrid.SelectedDataKey.Value)
         Select c).Single

        ' more code here

    End Using
End Sub

私の問題は、イベント ハンドラー内にあるため、null 参照エラーが発生することですProgressGrid.SelectedDataKey。Visual Studio 2010 でデバッグしているときに、コール スタックから、がヒットし、が 0 より大きいnothingことがわかります。では、オブジェクトのすべての "Selected..." プロパティがまたはに設定されているのはなぜですか? 私が間違っていることは何ですか?ProgressGrid.SelectRow(0)ProgressGrid.Rows.CountProgressGridnothing-1

カスタム Grid クラスには、デフォルトのGridView動作をオーバーライドする次のプロパティが含まれています。

    Public Overrides Property SelectedIndex() As Integer
        Get
            If AutoPostback Or AllowSelect = False Then
                Return MyBase.SelectedIndex
            Else
                If HttpContext.Current Is Nothing Then
                    Return Nothing
                    Exit Property 'Exit if in design mode
                End If
                Dim index As String = Page.Request(Me.ClientID + "_SelectedRow")
                If (String.IsNullOrEmpty(index)) Then
                    If (ViewState("SelectedIndex") Is Nothing) Then
                        Return -1
                    Else
                        Return ViewState("SelectedIndex")
                    End If
                Else
                    ViewState.Add("SelectedIndex", index)
                    Return CType(index, Integer)
                End If
            End If
        End Get
        Set(ByVal value As Integer)
            MyBase.SelectedIndex = value
        End Set
    End Property

デバッガーは詳細を表示できず、デバッガーのクイック ウォッチ ウィンドウが null 参照エラーを返すようにするMyBaseための最初の呼び出しが行われます。MyBase.SelectedIndex = valueイベント ハンドラーに到達すると、上記のプロパティのブレーク ポイントは、ゼロに設定しようとしたにもかかわらず、それMyBase.SelectedIndexがであることを示しています。nothing

4

1 に答える 1

1

ViewStateカスタム グリッドのSelectedIndexプロパティでを設定すると問題が解決することがわかりました。これにより、新しいインデックス値を保持し、プロパティでメソッドが呼び出されたViewStateときにそれを返すことができました。Get

Set(ByVal value As Integer)
    MyBase.SelectedIndex = value
    ViewState("SelectedIndex") = value
End Set
于 2013-06-16T21:04:12.167 に答える