最近做了一个“窗体加载中,请稍后”外加一个滚动条的winForm的窗体,感觉挺实用的,在这里给大家说一下。
因为做项目的时候,我做的是一个显示统计图的一个功能,但是这个数据量有点大,统计出来以后比较慢,需要两三秒的卡顿,也就是假死状态,所以做了一个窗体加载中,请稍后的窗体,外加一个滚动条。
开始知道这是需要多线程来处理的,一上来我先显示“窗体加载中”的窗体,让另一个线程去加载数据,于是查了很多的多线程的资料,后来才发现一个简简单单的控件就可以搞定,那就是Backgroundworker控件。
他的用法很简单,就是在开始的时候,讲我们要加载数据的方法写到他的DOWork方法里边,然后运行这个控件RunWorkerCompleted这个方法,他就会自动的开启一个线程,去加载里边的数据,然后加载完毕以后关闭就可以。 用法如下。
用于加载数据的窗体
首先我们把我们要加载的数据放到DOWork中,但是有一点要记住,在dowork中,不能涉及到控件,这样回报错。
/// <summary>
/// 异步 开始事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
//需要执行的代码
dt_CarsRepair = bll.GetRepairCount();
dt_Train = bll.GetTrainsCount();
dt_CarsDept = bll.GetSignCount();
}
然后是执行完成后
#region 异步执行完成后
/// <summary>
/// 事件: 异步执行完成后
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
处理数据
MessageBox.Show("数据加载完成", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
然后把这两个方法在窗体加载的时候添加到backgroundwork的控件中,代码如下
worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
最后from_load()中添加显示“窗体加载中”这个窗体,那么我们的主窗体的代码就完毕了。
//异步执行开始
worker.RunWorkerAsync();
//显示进度窗体
frmWaitting frm = new frmWaitting(this.worker);
frm.StartPosition = FormStartPosition.CenterScreen;
frm.ShowDialog(this);
用户显示“窗体加载中,请稍后。。。”的窗体
这个窗体需要添加一个backgroundwork控件,然后添加事件
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.Close();
}
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
lblStatus.Text = "数据加载中...";
}
窗体启动中,同样记载这两个方法。
worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
这样我们的窗体加载中,就可以实现了,如果你还想加一个滚动条的话,只需要加一个 progressBar的控件,把style设置成Marquee就可以了,是不是简单。