|
分類:[C#]
お世話になっております。
早速ですが、メインフォームのコントロールを別スレッドから操作しようとすると安全でないアクセスのため例外が発生します。 →Thread(),ThreadPool(),BackgroundWorker_DoWork()
BackgroundWorker()においては、DoWork()でなく、Complete()内で操作すれエラーは出ないのですが、処理が重いため避けたいと思っております。 ・DoWork - 別スレッドで実行 ・Complete - メインスレッドで実行
プログラムの概要ですが、FTP機能を実装したプログラムで、メインフォーム上にリストビュー(detail表示)があり、指定したディレクトリ内のファイルが表示されております。
ファイル選択後(複数可)、[アップロード]ボタン押下でサーバへファイルを転送します。
[アップロード]ボタン押下後、BackgroundWorker.RunWorkerAsync()をコールし、DoWork()内にて選択されたリストビューのインデックスを取得するため下記の処理を行っております。
foreach (ListViewItem lvItem in listViewClientDir.SelectedItems) { //Tagからフルパス取得 //アップ先URI作成 //アップロード }
listViewClientDir.SelectedItemsの部分が安全でないアクセスのため例外が発生します。
リストビューのカウントを数えるのであれば、下記デリゲートを宣言して、 private delegate int delGetLVClientItemsCount(); private int callback_GetLVClientItemsCount() { return listViewClientDir.Items.Count; }
DoWork()内から delGetLVClientItemsCount callbackGetLVClientCount = new delGetLVClientItemsCount(callback_GetLVClientItemsCount); int nLVCnt = (int)Invoke(callbackGetLVClientCount); MessageBox.Show(nLVCnt.ToString());
とすることで正しいカウント数が得られるのですが、選択されているかの情報はどのように取得すればよいでしょうか?
下記でエラーが発生します。 foreach ステートメントは、'System.Windows.Forms.ListViewItem' が 'GetEnumerator' のパブリック定義を含んでいないため、型 'System.Windows.Forms.ListViewItem' の変数に対して使用できません。
//デリゲート宣言 private delegate ListViewItem delGetLVClientSelectedItems(); private ListViewItem callback_GetLVClientSelectedItems() { ListViewItem lvItem = null; foreach (ListViewItem lv in listViewClientDir.SelectedItems) { lvItem = lv; } return lvItem; }
//DoWork()内 foreach (ListViewItem lvItem in (ListViewItem)Invoke(callbackGetLVClientSelectedItems))
ご教授頂ければ幸いです。 --- VS2005 SP1 C#
|