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