次のようなウィジェットオブジェクトが入力されたBindingListを含むC#WinFormsアプリがあります。
BindingList<Widget> widgetsList = new BindingList<Widget>();
ウィジェットには3つのプロパティ(1つはint、1つはstring、1つはbool)があり、INotifyPropertyChangedを実装します。ウィジェットは次のようにBindingListに追加されます。
for (int i = 0; i < 100000; i++) // takes < 1/10 of a second to execute
{
widgetsList.Add(new Widget(intValue, stringValue, boolValue));
}
最後に、BindingListをDataGridView(実際には3つのDataGridViewコントロール)のデータソースとして設定します。
dataGridView1.DataSource = widgetsList;
このコードはうまく機能しています。ただし、ユーザーがDataGridViewに変更を加えた後、それらの変更を破棄して元のデータを再読み込みしたい場合は、問題が発生しています。現在、これを行うためのボタンがあり、ボタンのClickイベントハンドラーのコードは次のようになります。
dataGridView1.Rows.Clear() // very fast
widgetsList.Clear() // also very fast
for (int i = 0; i < 100000; i++) // takes 18.6 seconds to execute
{
widgetsList.Add(new Widget(intValue, stringValue, boolValue));
}
ご覧のとおり、このループの実行速度は、上記の同じループよりも大幅に遅くなります(18.6秒対<.1秒)。それは機能しているように見えますが、私はボトルネックがどこにあるのか、そしてそれを取り除く方法を理解しようとしています。私は何かが足りないのですか?