C# 进度条帮助

C# 进度条帮助,c#,.net,winforms,C#,.net,Winforms,我对编程非常陌生,到目前为止一直做得相当不错。但是进度条仍然让我困惑。不幸的是,网络上有许多不同的例子,我想从中得到什么。有些人说使用后台工作人员,有些人不这样做,等等。下面我有我认为应该工作但不工作的东西。将文件从一个文件夹复制到另一个文件夹时,它只是一个进度条。感谢您的帮助 谢谢 private void btnCopyFiles_Click(object sender, EventArgs e) { string folder1 = @"c:\fol

我对编程非常陌生,到目前为止一直做得相当不错。但是进度条仍然让我困惑。不幸的是,网络上有许多不同的例子,我想从中得到什么。有些人说使用后台工作人员,有些人不这样做,等等。下面我有我认为应该工作但不工作的东西。将文件从一个文件夹复制到另一个文件夹时,它只是一个进度条。感谢您的帮助

谢谢

        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);
            }
        }
    }

我假设您正在使用VisualStudio,并通过将ProgressBar控件拖动到窗体中添加了该控件。如果这是正确的,则以下行可能是问题:

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

通过重新创建控件,您将失去它与窗体的链接。只需删除或注释该行,然后重试。

我假设您使用的是Visual Studio,并已通过将ProgressBar控件拖动到表单中添加了该控件。如果这是正确的,则以下行可能是问题:

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

通过重新创建控件,您将失去它与窗体的链接。只需删除或注释该行,然后再试一次。

是否尝试过progressbar1.Increment(x),其中x是传输的文件数?

是否尝试过progressbar1.Increment(x)其中x是传输的文件数?

总的来说,问题是您的代码继续执行,不允许表单根据需要重新绘制自身。最好、最快的方法是使用BackgroundWorker来实际执行您的操作,使用其事件来更新进度。执行此操作时,进度条的更新将在UI线程上完成,UI将更新,您的文件操作将在后台进行。

总的来说,问题是您的代码将继续执行,不允许表单根据需要重新绘制自身。最好、最快的方法是使用BackgroundWorker来实际执行您的操作,使用其事件来更新进度。执行此操作时,进度条的更新在UI线程上完成,UI更新时,文件操作在后台进行。

要在用户界面中更新进度条,处理某个内容的进程必须在另一个线程上执行(否则它会阻止UI线程,UI将不会更新)。后台工作人员是这样做的好人选


在后台工作者出现的情况下执行文件复制循环,并调用该方法来报告进度。在事件的事件处理程序中,可以在ProgressBar控件中设置值。您可以通过调用BackgroundWorker组件上的方法来启动流程。

要在用户界面中更新进度条,处理某个内容的流程必须在另一个线程上执行(否则它会阻止UI线程,并且UI将不会更新)。后台工作人员是这样做的好人选


在后台工作者出现的情况下执行文件复制循环,并调用该方法来报告进度。在事件的事件处理程序中,可以在ProgressBar控件中设置值。您可以通过调用BackgroundWorker组件上的方法来启动该过程。

因为您不熟悉使用该方法开始编程

之后


这将使您的应用程序暂时正常工作。您最终会希望将复制进程移动到线程/后台工作进程。但由于不了解您的能力,Application.DoEvents()可能是最简单的修复程序,但不是首选的修复程序。

因为您还不熟悉如何从这个开始编程

之后


这将使您的应用程序暂时正常工作。您最终会希望将复制进程移动到线程/后台工作进程。但由于不了解您的能力,Application.DoEvents()可能是最简单的修复程序,但不是首选的修复程序。

首先,创建一个结构来保存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));
    }
}
private void btnCopyFiles\u单击(对象发送方,事件参数e)
{
初始化BackgroundWorker();
CopyStruct CopyStruct=新的CopyStruct
{
sourceDir=@“C:\folder1\”,
destDir=@“C:\folder2\”
};
backgroundWorker.RunWorkerAsync(copyruct);
}
private void InitializeBackgroundWorker()
{
backgroundWorker.WorkerReportsProgress=true;
backgroundWorker.DoWork+=backgroundWorker\u DoWork;
backgroundWorker.RunWorkerCompleted+=backgroundWorker\u RunWorkerCompleted;
backgroundWorker.ProgressChanged+=backgroundWorker\u ProgressChanged;
}
private void backgroundWorker_ProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
progressBar.Value=e.ProgressPercentage;
}
私有void backgroundWorker_RunWorkerCompleted(对象发送方,runworkercompletedeventarge)
{
//完成后做某事
}
私有void backgroundWorker_DoWork(对象发送方,DoWorkEventArgs e)
{
BackgroundWorker worker=(BackgroundWorker)发送方;
CopyStruct CopyStruct=(CopyStruct)e.参数;
DirectoryInfo di=新的DirectoryInfo(copyruct.sourceDir);
FileInfo[]filelist=di.GetFiles(“*”);
int numFiles=filelist.Length;
对于(int i=0;i

这几乎不包含错误检查,因此您必须添加它,但它可以与我的系统上的一些测试目录一起使用。

首先,创建一个结构来保存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));
    }
}
private void btnCopyFiles\u单击(对象发送方,事件参数e)
{
初始化BackgroundWorker();
CopyStruct CopyStruct=新的CopyStruct
{
sourceDir=@“C:\folder1\”,
destDir=@“C:\folder2\”
};
backgroundWorker.RunWorkerAsync(c