2017-02-16 268 views
-1

データベース から、およびDelete Recordというコールを受け取るリストボックスから、選択したレコードを削除するために呼び出す関数を作成しました。C#ListBox:DataSourceプロパティが設定されているときにItemsコレクションを変更することはできません。

機能

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

ERROR:DataSourceプロパティが設定されている場合

Itemsコレクションを変更することはできません。

+4

DataSourceに関連付けられている基本オブジェクトから項目を削除する必要があります。 – Steve

+0

または、リストボックスの項目に値を設定する方法を変更することができます。あなたのデータセットを繰り返して、リストボックスにintemを挿入してください。そうすれば、リストボックスから特定の項目を削除することができます。 – Nino

+0

ところで、あなたはデータベースに接続する方法に注意してください!例外がある場合、接続は閉じられません。使用ブロックを使用します。また、コマンドパラメータを使用するか、アプリがSQLインジェクションに脆弱になります。 – Zesty

答えて

2

、WPF、Winformsのなど

あなたのリストボックスには、そのデータソースがListオブジェクトにバインドされている必要があります。リストビューコンポーネントから直接削除するのではなく、ビューがバインドされていることをリストから削除し、変更があることをUIに通知すると、それに応じて更新されます。ここで

は、リストオブジェクトにリストビューを結合に良い読み物です: Binding Listbox to List

迅速なGoogle検索は、変更が行われた後、UIを更新する方法で結果を返しますが、ここではWinFormsのためのものである: How to refresh DataSource of a ListBox in C# WinForms

1

データベース内のアイテムを削除してもう一度読むとお勧めします。おそらくデータベースからディスプレイへの最近のマッピングが必要になるからです。

その後、新しいレコードコレクションにDataSourceプロパティを再接続します。それは、そのようなあなたが使用しているフレームワークどのような付加的な詳細を提供するために役立つだろう

関連する問題