我写的项目中有一个过程。这需要时间,我想使用进度条。我想允许用户通过单击按钮取消进程和ProgressBar。我不希望用户在我的进程运行时能够单击该表单上的任何其他控件。如果我使用一个线程,那么用户可以单击表单上的其他控件。
也许一种解决方案是使用另一种形式,并在第二种形式上设置ProgressBar和取消按钮。但是如何根据我的进程设置ProgressBar的值,该进程参与第一个表单。
解决方案是什么?
提前致谢。
答案 0 :(得分:2)
使用BackgroundWorker
,这会提供用于报告进度和取消的API。
答案 1 :(得分:2)
最好通过对话框完成,它会自动使UI的其余部分无法访问。将新表单添加到项目中,并在其上放置ProgressBar和Button。并添加一个公共方法,以便您可以从主窗体中的事件处理程序更新进度条:
public partial class ProgressDialog : Form {
public ProgressDialog() {
InitializeComponent();
}
public void ShowProgress(int progress) {
progressBar1.Value = progress;
}
private void CancelProcess_Click(object sender, EventArgs e) {
this.DialogResult = DialogResult.Cancel;
}
}
启动工作人员时需要显示对话框:
ProgressDialog dlg;
private void RunProcess_Click(object sender, EventArgs e) {
backgroundWorker1.RunWorkerAsync();
using (dlg = new ProgressDialog()) {
dlg.ShowDialog(this);
}
dlg = null;
if (backgroundWorker1.IsBusy) backgroundWorker1.CancelAsync();
}
请注意它如何调用CancelAsync()来停止工作程序,因此关闭对话框足以使其停止。您需要更新进度条:
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) {
dlg.ShowProgress(e.ProgressPercentage);
}
当工作人员完成并且用户没有自己关闭对话框时,您需要自动关闭对话框:
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
if (dlg != null) dlg.Close();
}
答案 2 :(得分:1)
使用BackgroundWorker。将其添加到您的第一个表单并在BackgroundWorker上更改事件更改进度条值。查看文档中显示的示例。