0

System.IndexOutOfRangeException:位置5に行がありません。

アプリケーションに次のコードブロックがあります。これは、データベースから同じ行を完全に削除せずに、グリッドビューから行を削除できるようにするためです。

問題は、特定の順序または3つ以上を選択すると、値を削除できるが、すべての値を削除できないことです。

これは私が遭遇したエラーです!

System.IndexOutOfRangeException:位置5に行がありません。

コメント付きキャッチ例外は、問題をわずかに解決します。

Dim strQuery As String = "SELECT UserId, staffNo, forename, surname FROM userProfilesTbl WHERE st_id=@st_id AND wa_id=@wa_id ORDER BY surname ASC "
        Dim cmd As New SqlCommand(strQuery)
        cmd.Parameters.AddWithValue("@st_id", myLblSt.Value().ToString)
        cmd.Parameters.AddWithValue("@wa_id", myLblWa.Value().ToString)

        Dim dt As DataTable = GetDataConn(cmd)
        'Try
        For Each dr In GridView1.Rows

            Dim chkBox As CheckBox = dr.FindControl("RowLevelCheckBox")

            If chkBox.Checked = True Then

                dt.Rows.RemoveAt(dr.RowIndex)
                dt.AcceptChanges()

            End If
        Next
        'Catch ex As Exception

        'End Try
        GridView1.DataSource = dt
        GridView1.DataBind()
4

2 に答える 2

0

行を削除しているときに、他のインデックスが更新されていることが原因である可能性があります。たとえば、5 つの行があり、行 1、3、および 5 (インデックス 0、2、4) を削除したい場合。

したがって、以下がデータ グリッドであると仮定しましょう。

Index|Data
0--------A
1--------B
2--------C
3--------D
4--------E

1行目 (インデックス 0)を削除した後:

Index|Data
0--------B
1--------C
2--------D
3--------E

3行目 (インデックス 2)を削除した後:

Index|Data
0--------B
1--------C
3--------E

ここで、5番目の行 (インデックス 4)を削除しようとするとSystem.IndexOutOfRangeException、位置 4 に行がないため、 a が返されます。

于 2013-01-26T16:45:13.117 に答える
0

あなたの問題はおそらくここにあります:

 dt.Rows.RemoveAt(dr.RowIndex)

これはコレクションから削除されるため、次の反復で dr の行インデックスは無効になります。

この問題を回避するには、RowIndex の値を高くすることから低くすることをお勧めします。

于 2013-01-26T16:39:21.230 に答える