InvalidOperationException при привязке данных при удалении последнего элемента в списке - PullRequest
6 голосов
/ 30 апреля 2009

При попытке удалить последний элемент в сетке данных появляется следующее сообщение.

DataBinding не может найти строку в списке, подходящую для всех привязок.

У меня есть настройки привязки следующим образом.

ExtendedBindingList<MyClass> bl = new ExtendedBindingList<MyClass>(GetDataFromDB());
BindingSource bs = new BindingSource();
bs.DataSource = bl;
dgv.DataSource = bs;

ExtendedBindingList - это просто что-то простое, что я собрал для реализации сортировки и фильтрации, а также для некоторого сохранения основного состояния. dgv - это DataGridView. GetDataFromDB возвращает список MyClass.

Проблема возникает, только когда я пытаюсь удалить последний элемент из сетки данных, используя:

bs.RemoveCurrent();

, который работает в любое другое время. Мой единственный совет для решения - удалить все привязки и повторно применить их, но это не кажется идеальным решением.

EDIT Исключение выдается только после того, как BindingList успешно удаляет последний рассматриваемый элемент. Он добавляется во внешний код, поэтому я не могу точно сказать, что его вызывает.

Итак, я прошу SO о помощи:).

Заранее спасибо, Джастин

Ответы [ 2 ]

0 голосов
/ 16 октября 2013

[Извините, на самом деле это не ответ, но я считаю, что это ценно, поскольку ответа не было.]

Я получал точно такую ​​же ситуацию, используя .NET Compact Framework 2.0. Тестирование проследило его до точки, где NumericUpDown.DataBindings.Add () использовался для привязки элемента управления к источнику. После этого использования RemoveCurrent () выдаст ошибку, если элемент был последним в источнике. До этой привязки (или если она была пропущена) ошибка никогда не появится.

Другие элементы управления были связаны с тем же источником - TextBox и ComboBox - но они не вызывали такое поведение. Только элемент управления NumericUpDown.

0 голосов
/ 30 апреля 2009

Вот как я удаляю выбранную строку из сетки:

private void btnDelete_Click(object sender, EventArgs e)
{
  if (grid.CurrentRow == null) return;
  var selectedItem = grid.CurrentRow.DataBoundItem as PartGroup;
  if (selectedItem != null && 
    UIHelper.ShowQuestion("Are you sure you want to delete selected row?") == System.Windows.Forms.DialogResult.Yes)
  {
    groups.Remove(selectedItem);
  }
}

groups - это мой BindingListEx (Of T).

Надеюсь, это поможет.

...