3

次のようなウィジェットオブジェクトが入力された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秒)。それは機能しているように見えますが、私はボトルネックがどこにあるのか、そしてそれを取り除く方法を理解しようとしています。私は何かが足りないのですか?

4

1 に答える 1

4

上記のコメントからの回答の投稿:グリッドとバインディングリストの間にBindingSourceを追加する必要があります。これにより、ソースリストの再読み込み中にバインドを一時停止し、データソースが完全に更新されるまでグリッドがレンダリングを保留できるようになります。

于 2012-12-21T19:11:11.243 に答える