1

DBを処理し、ユーザーが処理できるように変更をListViewに書き込むプログラムを作成しています。その後、すべての変更をDBに書き戻すことになっていますが、BGWからListView.ListViewItemCollectionに到達する方法がわかりません。Control.Invoke を使用しようとしましたが、それを機能させるにはまだ十分なスキルがありません。

私が得ているエラーは、作成されていないスレッドからそのコントロールにアクセスできないことを示しています

 private delegate void BGOUdate(ListView.ListViewItemCollection lvic);
 BGOU = new BGOUdate(ApplyChanges);
 bgw1.RunWorkerAsync(lvProducts.Items);

 private void bgwSearcher_DoWork(object sender, DoWorkEventArgs e)
    {          
        BGOU(e.Argument as ListView.ListViewItemCollection);                
    }

 private void ApplyChanges(ListView.ListViewItemCollection lvic)
    {
        ...
        foreach (ListViewItem item in lvic)
        {
            ...
        }
        ...
    }
4

1 に答える 1

0

Control.Invoke歩く正しい方法です。ただし、コントロールをバックグラウンドワーカーだけでなく、バ​​ックグラウンドワーカーに渡す必要がありますItemCollection

private void ApplyChanges(ListView lv) 
{ 
    lv.Invoke((Action)delegate
    {
        foreach (ListViewItem item in lv.Items) 
        { 
            ... 
        }
    }); 
    ... 
} 

このように、ListViewItemsへのすべての変更は、コントロールを作成したスレッドで行われます。

Action引数をとらない事前定義されたvoidデリゲートです。キーワードdelegateは次のブロックを無名関数としてマークし、これへのデリゲートを返します。デリゲートはAction、コントロールで呼び出すことができるにキャストされます。toを呼び出すInvokeと、渡されたデリゲートが、コントロールのウィンドウハンドルに関連付けられているスレッドで実行されます。これは、ほとんどの場合、作成者のスレッドです。

たぶん、GUI要素をデータと同期させるためのオプションとしてDataBindingを検討する必要があります。

于 2012-07-04T20:22:03.457 に答える