当我单击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
请帮忙。谢谢 乔
答案 0 :(得分:1)
由于ViewState已被禁用,并且您只是在页面未被回发时进行数据绑定,因此该行总是会失败:
Dim row As GridViewRow = DirectCast(Gridview1.Rows(e.RowIndex), GridViewRow)
因为Gridview1.Rows
上的计数将为0.
当页面回发到服务器时,ASP.NET需要为控件启用ViewState,以便它可以重新创建控件并正确地确定要引发的事件,哪些控件值已更改等等。您应该启用ViewState,你必须找出导致控制树错误的原因。代码中必须进行一些其他修改。
请记住,当页面未回发时,只在Page_Load中对GridView进行数据绑定是正确的,但除非在控件上启用ViewState,否则无法正确处理事件。