2009-05-21 36 views
1

我非常新的節目,並一直在做相當好爲止。但進度條仍然讓我困惑。不幸的是,網絡上有很多不同的例子讓我從中得到任何東西。有人說使用後臺工作者不會,等等。下面我有我認爲應該工作,但沒有。它只是假設她將文件從一個文件夾複製到另一個文件夾時的進度條。任何幫助表示讚賞。進度條的幫助

謝謝。

 private void btnCopyFiles_Click(object sender, EventArgs e) 
    { 
     string folder1 = @"c:\folder1\"; 
     string folder2 = @"c:\folder2\"; 

     DirectoryInfo di = new DirectoryInfo(folder1); 
     FileInfo[] filelist = di.GetFiles("*.*"); 
     int count = di.GetFiles("*.*").Length; 

     this.progressBar1 = new System.Windows.Forms.ProgressBar(); 
     progressBar1.Maximum = count; 
     progressBar1.Minimum = 0; 
     progressBar1.Step = 1; 

     foreach (FileInfo file in filelist) 
     { 
      try 
      { 
       this.Cursor = Cursors.WaitCursor; 
       File.Copy(folder1 + @"\" + file.Name, folder2 + @"\" + file.Name, true); 
       progressBar1.PerformStep(); 
       this.Cursor = Cursors.Default; 
      } 
      catch (Exception error) 
      { 
       MessageBox.Show("Error: " + error); 
      } 
     } 
    } 

回答

4

我假設您正在使用Visual Studio並將ProgressBar控件拖到窗體中。如果這是正確的,那麼下面一行,可能是問題:

this.progressBar1 = new System.Windows.Forms.ProgressBar(); 

通過重新控制,你喪失其形式鏈接。只需刪除或註釋該行,然後再試一次。

+0

非常感謝!這樣可行。我認爲我必須在那裏有這個地方。但效果很好。再次感謝。 – JimDel 2009-05-21 21:55:43

+1

是否有理由接受我的答案,然後不接受? – ichiban 2009-05-21 21:57:19

+0

啊。好眼睛。我沒有看到。 – Crispy 2009-05-21 21:58:16

0

你試過progressbar1.Increment(x),其中x爲轉移的文件數?

2

總的來說,問題是,你的代碼將繼續執行,不容許的形式重新繪製本身,因爲它需要。最好,最快的路線是使用BackgroundWorker實際執行您的操作,並使用其事件更新進度。這樣做,進度條的更新在UI線程上完成,UI更新,文件操作在幕後進行。

1

進度條到你的用戶界面進行更新,這是工作的東西必須在另一個線程執行的過程中(否則它會阻止UI線程,並且UI將不會被更新)。 BackgroundWorker是一個很好的選擇。

在後臺工作人員的DoWork事件中執行文件複製循環,並調用BackgroundWorker.ReportProgress方法報告進度。在ProgressChanged事件的事件處理程序中,您可以在ProgressBar控件中設置該值。您通過調用BackgroundWorker組件上的RunWorkerAsync方法來啓動該過程。

1

既然你是編程新手開始與此有關。

添加

Application.DoEvents(); 

progressBar1.PerformStep(); 

這應該讓你的應用程序的工作現在。您最終需要將您的複製過程移至線程/後臺工作人員。但不知道你的能力,Application.DoEvents()可能是最簡單的修復,但不是首選的修復。

2

首先,創建一個結構來保存BackgroundWorker的參數,該參數將在DoWorkEventArgs中傳遞。

public struct CopyStruct 
{ 
    public string sourceDir; 
    public string destDir; 
} 

然後,做這樣的事情:

private void btnCopyFiles_Click(object sender, EventArgs e) 
{ 
    InitializeBackgroundWorker(); 

    CopyStruct copyStruct = new CopyStruct 
    { 
     sourceDir = @"C:\folder1\", 
     destDir = @"C:\folder2\" 
    }; 

    backgroundWorker.RunWorkerAsync(copyStruct); 
} 

private void InitializeBackgroundWorker() 
{ 
    backgroundWorker.WorkerReportsProgress = true; 
    backgroundWorker.DoWork += backgroundWorker_DoWork; 
    backgroundWorker.RunWorkerCompleted += backgroundWorker_RunWorkerCompleted; 
    backgroundWorker.ProgressChanged += backgroundWorker_ProgressChanged; 
} 

private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    progressBar.Value = e.ProgressPercentage; 
} 

private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    // do something when finished 
} 

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    BackgroundWorker worker = (BackgroundWorker) sender; 
    CopyStruct copyStruct = (CopyStruct) e.Argument; 

    DirectoryInfo di = new DirectoryInfo(copyStruct.sourceDir); 
    FileInfo[] filelist = di.GetFiles("*.*"); 

    int numFiles = filelist.Length; 

    for (int i = 0; i < numFiles; i++) 
    { 
     FileInfo file = filelist[i]; 

     File.Copy(Path.Combine(copyStruct.sourceDir, file.Name), Path.Combine(copyStruct.destDir, file.Name), true); 

     // This line updates the progress bar 
     worker.ReportProgress((int) ((float) i/numFiles*100)); 
    } 
} 

這幾乎不包含任何錯誤檢查,所以你必須補充一點,但它與我的系統上的一些測試工作目錄。