7

DataGridviewを使用してバインドしていBindingSourceます。したがって、メインスレッドでは、このように指定しました。

            class1BindingSource = new BindingSource();
            class1BindingSource.DataSource = class1List;  
            this.dataGridView1.DataSource = class1BindingSource;

その後、フォームにバックグラウンドワーカーを配置し、ボタンクリックでトリガーしています。

つまり、ボタンクリックで

this.backgroundWorker1.RunWorkerAsync()

で、BackgroundWorker DoWork Eventを更新BindingSourceしようとして、 を更新しようとしていDataGridviewます。

したがって、BindingSourceリセットは別のクラスのメソッドで行われます。

DoWork Event

Class2 cl2 = new Class2();
cl2.UpdateBindingSource(class1BindingSource);

UpdateBindingSource Method

public void UpdateBindingSource(BindingSource bs)
        {
            Class1 c1 = bs.Current as Class1;    
            for (int i = 0; i < 1000; i++)
            {
                lock (bs.SyncRoot)
                {
                    c1.MyProperty1 = i;
                    bs.ResetItem(0);
                }
            }
        }

現在、独自のデータ ソースになれないなどの例外が発生しています。およびプロパティを、 を参照する値にBindingSource設定しないでください。DataSourceDataMemberBindingSource

私が自分でこれを行っている場合は、DoWork Eventを使用して制御スレッド自体でアイテムをリセットできますBeginInvoke method

しかし実際には、アプリケーション シナリオをシミュレートしようとしています。だから私はこれをこの形式で解決したい。

誰でもこれについて私を助けることができますか?

4

3 に答える 3

17

BindingSource問題は、GUIスレッド以外のスレッド内でを更新できないことです。これは、BindingSourceがいくつかのイベントを発生させ、それがデータグリッドビューによって受信され、それ自体が更新を開始するためです。これは失敗し、GUIスレッドで実行されません。

したがって、電話をかける直前に電話をかけ、自分の中RunWorkerAsync()で電話をかける必要があります。class1BindingSource.SuspendBinding()RunWorkerCompletedclass1BindingSource.ResumeBinding()

また、DoWork(で行ったように)バインディングソースのメソッドを呼び出さないようにしてくださいbs.ResetItem(0)

また、このロックステートメントを削除します。それは(あなたの例では)まったく意味がなく、(実際のコードで)本当に必要な場合はprivate object _Gate = new Object();、クラス内でいくつかを使用して、外界からのデッドロックを回避することを検討してください。原因bs.SyncRootは公開されています。

于 2013-01-11T08:45:51.157 に答える
3

私は同じ問題を抱えていました: - INotifyPropertyChanged を持つ要素を持つ BindingSource - 要素を更新した別のタスク。

提案されたソリューション SuspendBinding などは機能しませんでした。BindingSource は、IsInvokeRequired のような処理を行う必要があります。

幸運なことに、Ivan Stoev は、BindingSource をサブクラス化し、IsInvokeRequired と同様のことを行うという素晴らしいアイデアを思いつきました。ありがとうイヴァン!

リンク:別のタスクから BindingSource を更新する

于 2015-10-01T15:01:26.183 に答える