Gridview RowUpdating错误 - 索引超出范围

时间:2011-06-27 03:33:35

标签: asp.net vb.net gridview

当我单击gridview中的“更新”按钮时,它会触发RowUpdating事件,但它会返回错误“索引超出范围。必须是非负数且小于集合的大小。参数名称:索引“

以下是vb代码:

Protected Sub GridView1_RowUpdating(ByVal sender As Object, ByVal e As GridViewUpdateEventArgs)
    If e.RowIndex >= 0 Then

        Dim row As GridViewRow = DirectCast(Gridview1.Rows(e.RowIndex), GridViewRow)
        Dim Col1_SL As CheckBox = DirectCast(row.FindControl("cb1_SL"), CheckBox)

.................       

        Dim cmd As New System.Data.SqlClient.SqlCommand
        Dim sql As String
        Dim reader As System.Data.SqlClient.SqlDataReader

        Using conn As New System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings("hris_shiftdutyConnectionString").ConnectionString)
            conn.Open()
            cmd.Connection = conn
            sql = "SET DATEFORMAT dmy;UPDATE troster SET SL='" & Convert.ToInt32(Col1_SL.Checked) & "' where roster_key='" & Col1_RosterKey.Text & "';"
            cmd.CommandText = sql
            reader = cmd.ExecuteReader()
            conn.Close()
            reader.Close()
        End Using

        'Reset the edit index.
        Gridview1.EditIndex = -1

        'Bind data to the GridView control.
        BindData()
    End If

End Sub

请帮忙。谢谢 乔

1 个答案:

答案 0 :(得分:1)

由于ViewState已被禁用,并且您只是在页面未被回发时进行数据绑定,因此该行总是会失败:

Dim row As GridViewRow = DirectCast(Gridview1.Rows(e.RowIndex), GridViewRow)

因为Gridview1.Rows上的计数将为0.

当页面回发到服务器时,ASP.NET需要为控件启用ViewState,以便它可以重新创建控件并正确地确定要引发的事件,哪些控件值已更改等等。您应该启用ViewState,你必须找出导致控制树错误的原因。代码中必须进行一些其他修改。

请记住,当页面未回发时,只在Page_Load中对GridView进行数据绑定是正确的,但除非在控件上启用ViewState,否则无法正确处理事件。