web-dev-qa-db-ja.com

ベースデータソースを更新するときにDataGridViewを更新する最良の方法

ベースデータソースを更新するときにDataGridViewを更新する最良の方法は何ですか?

私は頻繁にデータソースを更新しており、その結果をユーザーに表示したかったのです。

私はこのようなものを作りました(そしてそれは動作します)が、DataGridView.DataSourceは正しい方法とは思えません。

List<ItemState> itemStates = new List<ItemState>();
dataGridView1.DataSource = itemStates;

for (int i = 0; i < 10; i++) { 
    itemStates.Add(new ItemState { Id = i.ToString() });
    dataGridView1.DataSource = null;
    dataGridView1.DataSource = itemStates;
    System.Threading.Thread.Sleep(500);
}
53
shaunf

まあ、それはそれよりもはるかに良くなることはありません。公式には、使用する必要があります

dataGridView1.DataSource = typeof(List); 
dataGridView1.DataSource = itemStates;

まだ「クリア/リセットソース」のようなソリューションですが、DGVデータソースを確実に更新するものはまだ見つかっていません。

47
Alan

私は自分でこれに遭遇しました。私の推奨事項:データソースの所有権がある場合は、 List を使用しないでください。 BindingList を使用します。 BindingList には、アイテムが追加または変更されたときに起動するイベントがあり、 DataGridView は、これらのイベントが起動したときに自動的に更新されます。

48
GWLlosa

この場合、最もクリーンで効率的かつパラダイムに優しいソリューションは、アイテムリスト(データソース)とDataGridViewの間のプロキシとして_System.Windows.Forms.BindingSource_を使用することです。

_var itemStates = new List<ItemState>();
var bindingSource1 = new System.Windows.Forms.BindingSource { DataSource = itemStates };
dataGridView1.DataSource = bindingSource1;
_

次に、アイテムを追加するときに、リストのAdd()メソッドの代わりにBindingSourceAdd()メソッドを使用します。

_for (var i = 0; i < 10; i++)
{
    bindingSource1.Add(new ItemState { Id = i.ToString() });
    System.Threading.Thread.Sleep(500);
}
_

このようにして、リストにアイテムを追加し、同じコード行でそれらの追加についてDataGridViewに通知します。リストを変更するたびにDataGridViewDataSourceをリセットする必要はありません。

また、Visual StudioのフォームデザイナーでBindingSourceをフォームに直接ドロップし、データソースとしてDataGridViewにアタッチすることもできます。これにより、コードを1行節約できます。上記の例では、手動で実行しています。

13

Observablecollection:アイテムが追加、削除されたとき、またはリスト全体が更新されたときに通知を提供する動的なデータコレクションを表します。 IEnumerableインターフェイスを実装するコレクションを列挙できます。ただし、コレクションでの挿入または削除によってUIが自動的に更新されるように動的バインディングを設定するには、コレクションでINotifyCollectionChangedインターフェイスを実装する必要があります。このインターフェイスはCollectionChangedイベントを公開します。これは、基になるコレクションが変更されるたびに発生するイベントです。

Observablecollection<ItemState> itemStates = new Observablecollection<ItemState>();

for (int i = 0; i < 10; i++) { 
    itemStates.Add(new ItemState { Id = i.ToString() });
  }
 dataGridView1.DataSource = itemStates;
2
Kashif

これは [〜#〜] this [〜#〜] から回答をコピーします。

このように再びdatagridを埋めるだけです:

this.XXXTableAdapter.Fill(this.DataSet.XXX);

DataGridViewから自動的に接続する場合、このコードはForm_Load()で自動的に作成します

0
starko