与backgroundworker的Progressbar

时间:2017-04-09 11:31:30

标签: c# winforms progress-bar backgroundworker

如果用户选中了该文件夹的复选框,我会将下面的代码复制到其他位置。

我有一个背景工作者和一个progresbar。我看到本网站上甚至MSDN上的人都给出了用

更新进度条的相同示例
for (int i = 0; i <= 100; i++)
{
    // Report progress to 'UI' thread
    backgroundWorker1.ReportProgress(i);
    // Simulate long task
    System.Threading.Thread.Sleep(100);
}

这很好,我知道它是如何工作的。但我无法弄清楚的是实现我的复选框并复制文件夹(如果已检查),然后根据我拥有的复选框更新进度条。我计算了复选框并将其分配给prgbarmax。

这是我到目前为止所做的:

private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{           
   for (int i = 0; i < prgbarmax; i++)
    {
        int step = (i / prgbarmax) * 100;
        if (test1)
        {
            //do the copy here
            backgroundWorker1.ReportProgress(i);                    
        }

        if (tes2)
        {
            //do the copy here
            backgroundWorker1.ReportProgress(i);
        }

        if (test3)
        {
            //do the copy here                  
            backgroundWorker1.ReportProgress(i);
        }
        .... so on
    }
}

1 个答案:

答案 0 :(得分:0)

您需要构建要复制的文件夹列表,并在for循环的每次迭代中仅复制一个文件夹。代码的问题是您尝试在一次迭代中复制所有文件夹。

在代码示例中说明这个想法。

private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
    //construct the list of folder to be copied
    List<DirectoryInfo> listOfFolders = new List<DirectoryInfo>();
    if (test1) 
       listOfFolders.Add(folder1);
    if (test2)
       listOfFolders.Add(folder2);
    if (test3)
       listOfFolders.Add(folder3);

    //begin to copy
    for (int i = 0; i < listOfFolders.Count; i++)
    {
        listOfFolders[i].Copy(...); //copy only one folder in the list
        int step = ((i + 1) / listOfFolders.Count) * 100; //calculate the progress
        backgroundWorker1.ReportProgress(step);
    }
}