ベースデータソースを更新するときに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);
}
まあ、それはそれよりもはるかに良くなることはありません。公式には、使用する必要があります
dataGridView1.DataSource = typeof(List);
dataGridView1.DataSource = itemStates;
まだ「クリア/リセットソース」のようなソリューションですが、DGVデータソースを確実に更新するものはまだ見つかっていません。
私は自分でこれに遭遇しました。私の推奨事項:データソースの所有権がある場合は、 List を使用しないでください。 BindingList を使用します。 BindingList には、アイテムが追加または変更されたときに起動するイベントがあり、 DataGridView は、これらのイベントが起動したときに自動的に更新されます。
この場合、最もクリーンで効率的かつパラダイムに優しいソリューションは、アイテムリスト(データソース)とDataGridView
の間のプロキシとして_System.Windows.Forms.BindingSource
_を使用することです。
_var itemStates = new List<ItemState>();
var bindingSource1 = new System.Windows.Forms.BindingSource { DataSource = itemStates };
dataGridView1.DataSource = bindingSource1;
_
次に、アイテムを追加するときに、リストのAdd()
メソッドの代わりにBindingSource
のAdd()
メソッドを使用します。
_for (var i = 0; i < 10; i++)
{
bindingSource1.Add(new ItemState { Id = i.ToString() });
System.Threading.Thread.Sleep(500);
}
_
このようにして、リストにアイテムを追加し、同じコード行でそれらの追加についてDataGridView
に通知します。リストを変更するたびにDataGridView
のDataSource
をリセットする必要はありません。
また、Visual StudioのフォームデザイナーでBindingSource
をフォームに直接ドロップし、データソースとしてDataGridView
にアタッチすることもできます。これにより、コードを1行節約できます。上記の例では、手動で実行しています。
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;
これは [〜#〜] this [〜#〜] から回答をコピーします。
このように再びdatagridを埋めるだけです:
this.XXXTableAdapter.Fill(this.DataSet.XXX);
DataGridViewから自動的に接続する場合、このコードはForm_Load()で自動的に作成します