2017-02-16 10 views
-1

Я создал следующую функцию, чтобы вызвать удаление выбранной записи из базы данных , а также из списка, который получит звонок по кнопке Delete Record.C# ListBox: коллекция элементов не может быть изменена, когда установлено свойство DataSource

Функция:

void DeleteListBox2() 
{ 
    string connstring = String.Format("Server=localhost;Port=***;" + 
    "User Id=****;Password=****;Database=****;"); 

    NpgsqlConnection conn = new NpgsqlConnection(connstring); 
    conn.Open(); 

    for (int i = 0; i < listBox2.SelectedItems.Count; i++) 
    { 

     var itemname = listBox2.SelectedValue; 
     NpgsqlCommand cmd = new NpgsqlCommand("DELETE FROM Table WHERE Value = '" + itemname + "'", conn); 
     cmd.ExecuteNonQuery(); 
     MessageBox.Show("Selected record deleted from database"); 
     listBox2.Items.Remove(listBox2.SelectedItems[i]); //ERROR LINE 
     listBox2.Update(); 

    } 
    conn.Close(); 
} 

ОШИБКА:

Элементы коллекции не могут быть изменены, когда свойство DataSource установлено.

+4

Вы должны удалить элементы из базового объекта, связанного с источником данных. – Steve

+0

или вы можете изменить способ заполнения элементов списка. Перейдите по вашему набору данных и вставьте intems в список. Таким образом вы сможете удалить определенный элемент из списка. – Nino

+0

Кстати, будьте осторожны с тем, как вы подключаетесь к базе данных! Если у вас есть исключение, соединение не будет закрыто. Используйте блок использования. Кроме того, используйте параметры команды, или ваше приложение будет уязвимым для SQL-инъекции. – Zesty

ответ

2

Это помогло бы обеспечить дополнительные детали, например, какие каркасов вы используете, WPF, Winforms и т.д.

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

Здесь хорошо читать на связывание своего вида списка к списку объектов: Binding Listbox to List

Быстрый поиск Google будет возвращать результаты о том, как обновить пользовательский интерфейс, как только изменения были сделаны, вот один для WinForms: How to refresh DataSource of a ListBox in C# WinForms

1

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

После этого просто присоедините имущество DataSource к новой коллекции записей.