InvalidOperationException при привязке данных при удалении последнего элемента в списке

Я получаю следующее сообщение, когда пытаюсь удалить последний элемент в datagridview.

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 успешно удалит последний рассматриваемый элемент. Он выбрасывается во внешний код, поэтому я не могу точно сказать, что его выбрасывает.

Итак, вот я и прошу ТАК о помощи :).

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


person Justin Drury    schedule 29.04.2009    source источник


Ответы (2)


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

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);
  }
}

группы - это мой BindingListEx (Of T).

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

person nightcoder    schedule 29.04.2009
comment
Я использую DataGridView, а не Grid, но, по сути, это то, что я использую. Это работает каждый раз, кроме случаев, когда я удаляю последний элемент. - person Justin Drury; 30.04.2009
comment
В моем примере это DataGridView. BindingSource также используется, но я удаляю из BindingListEx, а не из BindingSource. Просто попробуйте этот код. Я также думаю, что ваша проблема как-то связана с последней строкой, предназначенной для быстрого добавления строк (AllowUserAddNewRows = true). Я помню, у меня была проблема с этим, и тогда я решил отключить его (установил для параметра AllowUserAddNewRows значение false). - person nightcoder; 30.04.2009
comment
Точно такая же ошибка. Это происходит в CurrencyManager.FindGoodRow(). который помечен как «внешний код» в стеке вызовов. У меня также установлено значение false для параметра AllowUserAddNewRows. - person Justin Drury; 30.04.2009
comment
Попробуйте вызвать bs.SuspendBinding() перед удалением строки и bs.ResumeBinding() после удаления строки. - person nightcoder; 30.04.2009
comment
Некоторые, да. Форма настроена в дизайне Master-Detail. Есть несколько полей со списком, которые заполняются из другого источника данных, и мне нужно выполнить привязку к ним вручную. - person Justin Drury; 30.04.2009
comment
SuspendBinding и ResumeBinding ничем не помогли. - person Justin Drury; 30.04.2009
comment
А так же можете показать весь код с привязками и настройкой источников данных. - person nightcoder; 01.05.2009

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

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

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

person IronRod    schedule 15.10.2013