c#中如何控制模态子窗体中的进度条
这个问题会让一些初学者感到困惑,一方面模态窗体在打开之后(Form.ShowDialog).主线程无法继续执行下面的事务;另一方面,又要在处理事务的时候来同步这个窗体里面的进度条。这两件事情都必须做,却都不能先做...
所以很多人不得不把事务处理写到模态窗体当中去,这样可以达到目的,却造成了代码结构混乱,而且子窗体无法复用,如果有多个事物,不得不为每个事务来写控制窗体。
这里我们介绍一种比较直接了当的方法,就是主线程中开启两个子线程,一个用于显示模态窗体,一个用于处理事务, 并同时更新第一个线程中的窗体信息。
这里的知识范畴会包含线程的基础用法,线程和UI之间的交互,以及委托的基本用法。如果你还不了解这几点,可以参考一些其他资料,比如我先前写过的,在同一窗体中用子线程来控制进度条
http://blog.csdn.net/jinjazz/archive/2008/05/06/2397136.aspx
这里的应用稍微复杂一些,你可以先用Vs2005新建一个Windows Application,这个application包含两个窗体,一个Form1,为主窗体,一个Form2,为模态子窗体。Form1,中添加Button1,用来开启测试。Form2中添加进度条ProgressBar1和一个用来取消事务的按钮Button1。然后把如下代码贴入测试程序中的两个form里面。
Form1,主窗体
using
System;
using
System.Windows.Forms;
namespace
WindowsApplication39
{
public
partial
class
Form1 : Form
{
delegate
void
dShowForm();
Form2 frm
=
new
Form2();
public
Form1()
{
this
.InitializeComponent();
}
//
显示窗体
void
ShowForm()
{
if
(
this
.InvokeRequired)
{
this
.Invoke(
new
dShowForm(
this
.ShowForm));
}
else
{
frm.ShowDialog(
this
);
}
}
//
控制进度
void
SetProgress()
{
for
(
int
i
=
1
; i
<=
100
; i
++
)
{
if
(frm.DialogResult
==
DialogResult.Cancel)
{
//
判断取消
break
;
}
else
{
//
模拟进度
frm.SetProgress(
100
, i);
System.Threading.Thread.Sleep(
50
);
}
}
}
private
void
button1_Click(
object
sender, EventArgs e)
{
new
System.Threading.Thread(
new
System.Threading.ThreadStart(ShowForm)).Start();
new
System.Threading.Thread(
new
System.Threading.ThreadStart(SetProgress)).Start();
}
}
}
Form2,模态窗体
using
System;
using
System.Windows.Forms;
namespace
WindowsApplication39
{
public
partial
class
Form2 : Form
{
public
Form2()
{
InitializeComponent();
}
public
delegate
void
dSetProgress(
int
total,
int
current);
public
void
SetProgress(
int
total,
int
current)
{
if
(
this
.InvokeRequired)
{
try
{
this
.Invoke(
new
dSetProgress(
this
.SetProgress),
new
object
[]
{ total, current }
);
}
catch
{ }
}
else
{
this
.progressBar1.Maximum
=
total;
this
.progressBar1.Value
=
current;
}
}
private
void
button1_Click(
object
sender, EventArgs e)
{
this
.DialogResult
=
DialogResult.Cancel;
}
}
}
浙公网安备 33010602011771号