ASP.Net GridView.SelectRow(rowIndex as integer)方法无法将rowIndex传递给SelectedIndexChanged事件处理程序

时间:2013-06-16 20:27:00

标签: asp.net vb.net-2010

在一些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.SelectedIndexnothing,尽管尝试将其设置为零。

1 个答案:

答案 0 :(得分:1)

我发现在自定义网格的ViewState属性中设置SelectedIndex解决了我的问题。这允许ViewState保留新的索引值,并在属性上调用Get方法时返回它。

Set(ByVal value As Integer)
    MyBase.SelectedIndex = value
    ViewState("SelectedIndex") = value
End Set