Как удалить выбранные элементы из ListBox, когда ему назначен источник данных в C #? - PullRequest
5 голосов
/ 02 апреля 2009

Как удалить выбранные элементы из ListBox, когда ему назначен источник данных в C #?

При попытке удалить, появилась ошибка

"Коллекция элементов не может быть изменена, если установлено свойство DataSource."


Но когда я пытаюсь удалить элемент из источника данных (с данными),

ошибка "datarow отсутствует в текущей коллекции строк".

Ответы [ 9 ]

9 голосов
/ 02 апреля 2009

Найдите этот элемент в объекте DataSource и удалите его, затем повторно свяжите ListBox.

EDIT

Вот как вы удаляете данные из таблицы данных в качестве источника данных, независимо от версии .NET.

DataRowView rowView = listBox.SelectedItem as DataRowView;

if (null == rowView)
{
    return;
}

dt.Rows.Remove(rowView.Row);

Я не пробовал использовать ничего кроме WinForms DataGridViews, но я настоятельно рекомендую BindingListView , который быстрее, чем DataTables / Views, и позволяет вам связывать универсальные List s в качестве источника данных.

2 голосов
/ 02 апреля 2009

В качестве альтернативы используйте список, который реализует IBindingList или наследует от BindingList. Когда объекты добавляются или удаляются из списка привязок, все связанные с ним элементы управления автоматически уведомляются об изменениях и обновляются соответствующим образом. Если вы используете BindingList и ваш класс также реализует измененный INotifyProperty, Любые изменения свойств класса также будут автоматически обновляться в элементе управления привязкой данных. Например, если столбец в сетке данных (представление) привязан к свойству «Имя», и вы изменили «Имя» в источнике данных, сетка данных автоматически обновится. Если вы добавите новый элемент в источник данных, сетка данных обновится автоматически. Binding List также поддерживает уведомления в другом направлении. Если пользователь редактирует поле «Имя» в сетке данных, связанный объект будет обновлен автоматически. Немного отойдя от темы, если вы пойдете немного дальше и предложите «SupportsSortingCore» и связанные методы в BindingList, вы можете добавить автоматическую сортировку данных. Нажатие на заголовок столбца автоматически сортирует список и отображает стрелку направления сортировки заголовка.

1 голос
/ 09 июня 2011

при получении сообщения «Коллекция элементов не может быть изменена, если установлено свойство DataSource». установка источника данных на что-то другое, пустой список или ноль, не помогает, когда код инициализироватькомпонент не завершен.

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

Я знаю, что это не имеет смысла. Однако дизайнер Visual Studio сгенерирует код в виде designer.cs или vb, который будет добавлять элементы в список, если какой-либо код, который изменяет элементы, будет найден до завершения инициализации компонентов

0 голосов
/ 15 апреля 2012

Это сработало для меня

        DataTable temp = (DataTable)lstBlocks.DataSource;
        temp.Rows.RemoveAt(position);
0 голосов
/ 27 февраля 2012

Хотя Крис Доггетт опубликовал правильное решение, я столкнулся с проблемами при его использовании. Используя этот метод, он не позволял последующему GetChanges (DataRowState.Deleted) работать должным образом.

Чтобы лучше решить мою проблему, мне нужно было изменить только одну строку - последнюю строку.

DataRowView rowView = listBox.SelectedItem as DataRowView;

if (null == rowView)
{
    return;
}

rowView.Row.Delete();

Это позволило моему вызову GetChanges работать правильно.

0 голосов
/ 29 апреля 2010

Ошибка реализации ListBox, вам нужно создать новый экземпляр источника данных для компонента, чтобы он распознал изменение.

Например:

ActivitiesList.DataSource = _activities;

_activities = new List<Activity>(_activities);
_activities.Remove((Activity)ActivitiesList.SelectedItem);

ActivitiesList.DataSource = _activities;
0 голосов
/ 10 июня 2009

это очень просто, назначьте новое пустое значение списку например ..

Dim ABC As New List (Of String) ()

ListBox1.DataSource = ABC

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

Вам нужно изменить источник данных, а не коллекцию Items элемента управления. В зависимости от того, к какому типу источника данных вы привязываетесь, вам придется делать разные вещи, чтобы ваш пользовательский интерфейс обновлялся.

Лучший способ - найти коллекцию, которая соответствует вашим потребностям и реализует IBindingList или IBindingListView. Эти два интерфейса реализуют даже обработчики, которые прослушивают событие CollectionChanged и соответственно обновляют ваш пользовательский интерфейс.

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

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

Если ListBox имеет назначенный источник данных, необходимо удалить элементы из источника данных, а затем повторно связать ListBox

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...