Поскольку опубликованный цикл for
«нарушен», я чувствую, что нет необходимости подвергать сомнению то, чего вы пытаетесь достичь здесь. Однако, учитывая то, что вы описали, где на форме есть две сетки и две кнопки (Добавить / Удалить). При нажатии кнопки «Добавить» она перемещает «выбранные строки» из «левой» сетки в «правую» сетку, а затем удаляет строки «выбранных строк» из «левой» сетки. Если нажать кнопку «Удалить», происходит обратный процесс, перемещая «выбранные строки» из правой сетки в левую, а затем удаляет выбранные строки из правой сетки.
Если это правильно, то, кажется, вы делаете это более сложным, чем это должно быть. Это было бы намного проще, если бы вы использовали источник данных какой-либо формы. Однако, чтобы устранить вышеуказанную проблему, кажется, что два метода могут пригодиться для того, что вы хотите сделать. Первый может просто добавить выбранные строки из одной заданной сетки в другую заданную сетку. Следующий метод просто удалит выбранные строки из данной сетки. При реализации этих двух методов кнопка «Добавить» будет…
AddSelectedRows(dgvLeft, dgvRight)
RemoveSelectedRows(dgvLeft)
Кнопка удаления будет ...
AddSelectedRows(dgvRight, dgvLeft)
RemoveSelectedRows(dgvRight)
Прежде чем я объясню приведенный ниже код, следует заметить, что ваш текущий опубликованный код делает огромное программирование "нет-нет" и, без сомнения, является проблемой для вас. Как отмечали Мэри и другие, «изменение значения переменной счетчика в цикле или (как делает код) изменение коллекции, через которую она проходит, редко, если когда-либо делается».
Попробуйте код ниже, это может упростить ситуацию,
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