一部の 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.Count
ProgressGrid
nothing
-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