我有一个奇怪的问题。我有一个表单,上面有2个无界数据网页和2个按钮。使用按钮,我将行从1个数据网格切换到另一个。 在开始时,左数据网格填充了许多行,右数据网格是空的。所以,当我点击按钮"添加"将删除左侧数据网格中的选定行并将其添加到右侧数据网格中。使用按钮"删除"右侧数据网格的选定行将添加回左侧数据网格。
当右数据网格中只有一行时,我选择它去"删除"它,该行从右侧数据网格中删除,并添加到左侧,没有异常。现在我的情况是左数据网格中只有一行,当我点击"添加"将它移动到正确的数据网格我得到一个ArgumentOutOfRangeException(索引超出界限......)
以下是抛出异常的代码
For i As Integer = DgvLeft.SelectedRows.Count - 1 To 0 Step -1
ind = DgvLeft.SelectedRows(i).Index
If ind > 0 Then
DgvLeft.Rows.RemoveAt(ind)
Else
DgvLeft.Rows.Remove(DgvLeft.SelectedRows(i))
End If
Next
所以我将行索引存储在变量中。我第一次使用RemoveAt函数并抛出异常。为了解决这个问题,我添加了If-structure并尝试了Remove功能。但同样抛出异常。
我不明白为什么抛出异常。我使用相同的代码进行"删除"按钮在那里它没有发生。此外,当我将RowIndex存储在变量中时索引是已知的,但是当我尝试删除行时却不知道。
有人可以帮我解决这个奇怪的问题吗?
答案 0 :(得分:1)
由于发布的for
循环“已损坏”,我认为没有必要质疑您在此处要完成的任务。但是,根据您所描述的,表单上有两个网格和两个按钮(添加/删除)。单击“添加”按钮时,它会将“选定行”从“左”网格移动到“右”网格,然后从“左”网格中删除“选定行”行。如果单击“删除”按钮,则会发生相反的过程,将“选定的行”从右侧网格移动到左侧网格,然后从右侧网格中删除选定的行。
如果这是正确的,那么看起来你正在使它变得比它更复杂。如果您使用某种形式的数据源,这将更容易。但是,为了解决上述问题,似乎有两种方法可以派上用场。第一个可以简单地将选定的行从一个给定的网格添加到另一个给定的网格。下一个方法只是从给定的网格中删除选定的行。实现这两个方法后,“添加”按钮将是......
AddSelectedRows(dgvLeft, dgvRight)
RemoveSelectedRows(dgvLeft)
删除按钮将是......
AddSelectedRows(dgvRight, dgvLeft)
RemoveSelectedRows(dgvRight)
在我解释下面的代码之前,应该注意的是,您当前发布的代码正在进行大量编程“禁忌”,毫无疑问是您的问题。正如Mary和其他人所指出的那样,“在一个循环中改变计数器变量的值或者(正如代码所做的那样)改变它循环的集合很少,如果有的话。”
尝试下面的代码可能会让事情变得更轻松,
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
AddColumns(dgvLeft)
AddColumns(dgvRight)
FillGrid(dgvLeft)
End Sub
Private Sub FillGrid(dgv As DataGridView)
For i = 0 To 15
dgv.Rows.Add("C0R" + i.ToString(), "C1R" + i.ToString(), "C2R" + i.ToString())
Next
End Sub
Private Sub AddColumns(dgv As DataGridView)
Dim txtCol = New DataGridViewTextBoxColumn()
txtCol.Name = "Col0"
txtCol.HeaderText = "Col 0"
dgv.Columns.Add(txtCol)
txtCol = New DataGridViewTextBoxColumn()
txtCol.Name = "Col1"
txtCol.HeaderText = "Col 1"
dgv.Columns.Add(txtCol)
txtCol = New DataGridViewTextBoxColumn()
txtCol.Name = "Col2"
txtCol.HeaderText = "Col 2"
dgv.Columns.Add(txtCol)
End Sub
Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click
AddSelectedRows(dgvLeft, dgvRight)
RemoveSelectedRows(dgvLeft)
End Sub
Private Sub btnDelete_Click(sender As Object, e As EventArgs) Handles btnDelete.Click
AddSelectedRows(dgvRight, dgvLeft)
RemoveSelectedRows(dgvRight)
End Sub
Private Sub RemoveSelectedRows(dgv As DataGridView)
Dim totalRowsToDelete = dgv.SelectedRows.Count
Dim selectedRow As DataGridViewRow
For i = totalRowsToDelete - 1 To 0 Step -1
selectedRow = dgv.SelectedRows(i)
If (Not selectedRow.IsNewRow) Then
dgv.Rows.RemoveAt(dgv.SelectedRows(i).Index)
End If
Next
End Sub
Private Sub AddSelectedRows(sourceDGV As DataGridView, destinationDGV As DataGridView)
Dim selectedRowCount = sourceDGV.Rows.GetRowCount(DataGridViewElementStates.Selected)
If (selectedRowCount > 0) Then
Dim selectedRow As DataGridViewRow
For i = 0 To selectedRowCount - 1
selectedRow = sourceDGV.SelectedRows(i)
If (Not selectedRow.IsNewRow) Then
destinationDGV.Rows.Add(selectedRow.Cells(0).Value.ToString(),
selectedRow.Cells(1).Value.ToString(),
selectedRow.Cells(2).Value.ToString())
End If
Next
End If
End Sub
答案 1 :(得分:0)
您正在更改For循环中DgvLeft.SelectedRows.Count
的值。
尝试...
Dim RowCount As Integer = DgvLeft.SelectedRows.Count
For i As Integer = RowCount - 1 To 0 Step -1
答案 2 :(得分:0)
我要感谢玛丽的回答,因为这让我想到了我的代码。我看了"删除"的代码。按钮,我使用相同的for循环,并且该代码不会抛出异常。所以我的两个按钮的代码必须有区别。
这是我在"添加"中的代码的扩展部分。按钮:
For i As Integer = DgvLeft.SelectedRows.Count - 1 To 0 Step -1
'fill the array with the row values
For j As Integer = 0 To DgvLeft.Columns.Count - 1
fields(j) = DgvLeft.SelectedRows(i).Cells(DgvLeft.Columns(j).Name).Value
Next
'delete the row in datagrid Left
ind = DgvLeft.SelectedRows(i).Index
If ind > 0 Then
DgvLeft.Rows.RemoveAt(ind)
Else
DgvLeft.Rows.Remove(DgvLeft.SelectedRows(i))
End If
'add the row in datagrid Right
DgvRight.Rows.Add(fields)
Next
在上面的代码片段中,我尝试在将此行的值数组添加到其他数据网格之前删除一行。当我查看"删除"的代码时按钮我尝试在将值数组添加到其他数据网格后删除该行。
所以我把这段代码移到了添加值数组的代码下面并且它工作了。可能是数组抛出索引异常而不是datagridview。