Причина, по которой это работает только при выборе снизу вверх, состоит в том, что BindingSource.Current
указывает на последний выбранный элемент, поэтому, если вы выбираете сверху вниз, вы сравниваете с невыбранными элементами.
Кажется, у вас также есть ошибка, из-за которой ваши first
и second
меняются местами.Вы используете операцию увеличения постфикса, когда, вероятно, не хотели этого делать.
Допустим, _bs.Position
равно 5;
int first = _bs.Position; // first is now 5
int second = first++; // postfix increment: second is now 5, first is now 6
Как сказано в документации ,
результатом операции является значение операнда до его увеличения
Итак, вы действительно сделали это:
second = first;
first = first + 1;
Похоже, вы просто хотели сделать это:
second = first + 1;
В этом случае, вероятно, не было никакой разницы, но это делает для довольно запутанного кода.
Существует множество подходов к тому, что вы пытаетесь сделать.Вот, пожалуй, более прямой и понятный способ:
int count = dgv.SelectedRows.Count;
// DataGridView.SelectedRows is reverse order, so the first selected item is the last item in the list
var firstSelected = dgv.SelectedRows[count - 1].DataBoundItem as CheckOrderLine;
int firstOrderNumber = firstSelected.OrderNumber;
// starting at second-last item (second selected row)
for (int i = count - 2; i >= 0; i--)
{
var row = dgv.SelectedRows[i];
var item = row.DataBoundItem as CheckOrderLine;
if (item.OrderNumber == firstOrderNumber)
dgv.Rows.Remove(row);
}
Для простоты я упустил обновление оставшейся строки и проверку ошибок.
Обратите внимание, что это будет работать дажеесли совпадающие строки не являются последовательными.Вам решать, разрешить это или нет.