[英]Producing a progress bar while loading in C#
I have the below code which just shows a message text box while loading: 我有以下代码,仅在加载时显示消息文本框:
private void button3_Click_1(object sender, EventArgs e)
{
int i;
BackgroundWorker bw = new BackgroundWorker();
bw.WorkerReportsProgress = true;
bw.WorkerSupportsCancellation = true;
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
msgForm = new Form2(); //Form2 is showing a message "Please Wait..."
try
{
bw.RunWorkerAsync(comboBox15.Text);
msgForm.StartPosition = FormStartPosition.CenterParent;
msgForm.ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
void bw_DoWork(object sender, DoWorkEventArgs e)
{
string PrtAdd = e.Argument.ToString();
Loading(PrtAdd); //This is the function of my loading.
}
void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
msgForm.Close();
}
My loading will sometimes takes 2-3 minutes. 我的加载有时需要2-3分钟。 So, if just show a static message box, probably the user will think maybe my program is hang somewhere.
因此,如果只显示一个静态消息框,则用户可能会认为也许我的程序挂在某个地方。
I would like to improve this by adding a progress bar while loading. 我想通过在加载时添加进度条来改善这一点。 Can you guys help me?
你们能帮我吗?
Something like this, perhaps? 大概是这样吗?
public partial class Form1 : Form
{
private Form2 _frm2;
public Form1() {
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
var bw = new BackgroundWorker();
bw.WorkerReportsProgress = true;
bw.WorkerSupportsCancellation = true;
bw.DoWork += BwOnDoWork;
bw.RunWorkerCompleted += BwOnRunWorkerCompleted;
bw.RunWorkerAsync();
_frm2 = new Form2(bw);
_frm2.StartPosition = FormStartPosition.CenterParent;
_frm2.ShowDialog();
}
private void BwOnRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs runWorkerCompletedEventArgs)
{
if (_frm2 != null)
{
_frm2.Close();
}
}
private void BwOnDoWork(object sender, DoWorkEventArgs doWorkEventArgs)
{
var bw = sender as BackgroundWorker;
var i = 0;
while (i < 100 && !bw.CancellationPending)
{
bw.ReportProgress(i);
Thread.Sleep(100);
i++;
}
}
}
public partial class Form2 : Form
{
private BackgroundWorker _bw;
public Form2() {
InitializeComponent();
}
public Form2(BackgroundWorker bw) : this()
{
_bw = bw;
_bw.ProgressChanged += BwOnProgressChanged;
}
private void BwOnProgressChanged(object sender, ProgressChangedEventArgs progressChangedEventArgs)
{
progressBar1.Value = progressChangedEventArgs.ProgressPercentage;
}
private void button1_Click(object sender, EventArgs e) {
_bw.CancelAsync();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.