2012-04-19 6 views
0

Dlistと呼ばれるメインフォームにListViewがあります。バックグラウンドワーカーでファイルをダウンロードするバックグラウンドワーカーがいます。どのようにしてメインフォームのリストビューのサブアイテム "Progress"を編集できますか?BackgroundworkerからListViewにアクセスする

マイコード:

BackgroundWorker worker = new BackgroundWorker(); 
worker.DoWork += (obj, e) => WorkerDoWork(link, savepath,Dlist); 
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(progress_complete); 
worker.ProgressChanged += new ProgressChangedEventHandler(progress_changed); 
worker.RunWorkerAsync(); 


rivate void WorkerDoWork(string link, string savepath, ListView Dlist) 
    { 
     // Start Download 
     Uri url = new Uri(link); 
     System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url); 
     System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)request.GetResponse(); 
     response.Close(); 
     Int64 iSize = response.ContentLength; 
     Int64 iRunningByteTotal = 0; 
     using (System.Net.WebClient client = new System.Net.WebClient()) 
     { 
      using (System.IO.Stream streamRemote = client.OpenRead(new Uri(link))) 
      { 
       using (Stream streamLocal = new FileStream(savepath, FileMode.Create, FileAccess.Write, FileShare.None)) 
       { 
        int iByteSize = 0; 
        byte[] byteBuffer = new byte[256]; 
        while ((iByteSize = streamRemote.Read(byteBuffer, 0, byteBuffer.Length)) > 0) 
        { 
         streamLocal.Write(byteBuffer, 0, iByteSize); 
         iRunningByteTotal += iByteSize; 
         double dIndex = (double)(iRunningByteTotal); 
         double dTotal = (double)byteBuffer.Length; 
         double dProgressPercentage = (dIndex/dTotal); 
         int iProgressPercentage = (int)(dProgressPercentage * 100); 
         //Dlist.Items[Dlist.Items.IndexOfKey(fileName)].SubItems[2].Text = iProgressPercentage.ToString(); 
        } 
        streamLocal.Close(); 
       } 
       streamRemote.Close(); 
      } 
     } 
    } 

このライン(//Dlist.Items[Dlist.Items.IndexOfKey(fileName)].SubItems[2].Text = iProgressPercentage.ToString();)それがありますリストビューを更新するが、私はクロススレッドを取得し続ける。

答えて

1

backgroundworkerは実際にはUIスレッドとは別のスレッドなので、そのusercontrolの呼び出しが必要かどうかを確認する必要があります。以下 がある私はListView1のは、あなたのDLISTいる使用ソースコードのビット..

delegate void SetListViewItemCallBack(ListViewItem Item); 
    private void AddListViewItem(ListViewItem Item) 
    { 
     if (this.listView1.InvokeRequired) 
     { 
      SetListViewItemCallBack d = new SetListViewItemCallBack(AddListViewItem); 
      this.Invoke(d, new object[] { Item }); 
     } 
     else 
     { 
      this.listView1.Items.Add(Item); 
     } 
    } 
    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     DataSet dsInfo = // whatever you want.. 
     for (int i = 0; i < dsInfo.Tables[0].Rows.Count; i++) 
     { 
      ListViewItem li = new ListViewItem(); 
      li.Text = dsInfo.Tables[0].Rows[i]["AXT_Tag"].ToString(); 
      li.Tag = dsInfo.Tables[0].Rows[i]["AXT_ID"].ToString(); 
      AddListViewItem(li); 
     } 
    } 
1

、私がtrueにBackgroundWorker.WorkerReportsProgressを設定し、BackgroundWorker.ProgressChangedイベントをサブスクライブします。そのイベントをUIスレッドで処理し、(Do_Workメソッドから呼び出された)進捗状況を引数から抽出し、そこからリストビューを更新することで使用できます。

関連する問題