在一些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
我的问题是ProgressGrid.SelectedDataKey
在我的事件处理程序中是nothing
,导致空引用错误。在使用Visual Studio 2010进行调试时,我可以从调用堆栈中看到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
调试器无法显示MyBase
的详细信息,并且对MyBase.SelectedIndex = value
的第一次调用使调试器的快速监视窗口返回空引用错误。到达事件处理程序后,上述属性中的断点表示MyBase.SelectedIndex
为nothing
,尽管尝试将其设置为零。
答案 0 :(得分:1)
我发现在自定义网格的ViewState
属性中设置SelectedIndex
解决了我的问题。这允许ViewState
保留新的索引值,并在属性上调用Get
方法时返回它。
Set(ByVal value As Integer)
MyBase.SelectedIndex = value
ViewState("SelectedIndex") = value
End Set