如何在winform应用程序中单击按钮时显示繁忙窗口
本文关键字:显示 窗口 按钮 单击 winform 应用程序 | 更新日期: 2023-09-27 18:25:24
我的主窗体有一个按钮。单击按钮后,我将填充一个网格。这是我的按钮点击程序
private void btnSearch_Click(object sender, EventArgs e)
{
if (chkExcludeCallCust.Checked)
{
if (chkEnable.Checked)
RangeExclude = 1;
else
RangeExclude = 0;
}
new Thread(() =>
{
lock (thisLock)
{
Search();
}
}).Start();
}
当用户单击搜索按钮时,会调用一个线程。从那个线程中,我从数据库中获取数据并填充网格。
下面是我的搜索程序:
private void Search()
{
DataSet ds = null;
if (wfrm.InvokeRequired)
{
wfrm.Invoke(new MethodInvoker(delegate
{
wfrm.Show();
wfrm.Refresh();
Application.DoEvents();
}));
}
else
{
wfrm.Show();
wfrm.Refresh();
Application.DoEvents();
}
if (this.InvokeRequired)
{
this.Invoke(new MethodInvoker(delegate {
this.Cursor = Cursors.WaitCursor;
btnSearch.Enabled = false;
}));
}
else
{
this.Cursor = Cursors.WaitCursor;
btnSearch.Enabled = false;
}
if (!PingTest())
{
if (this.InvokeRequired)
{
this.Invoke(new MethodInvoker(delegate
{
this.Cursor = Cursors.Default;
MessageBox.Show("VPN disconnected. Please connect and try again.", "DebtorCallerAssistance");
return;
}));
}
else
{
this.Cursor = Cursors.Default;
MessageBox.Show("VPN disconnected. Please connect and try again.", "DebtorCallerAssistance");
return;
}
}
if (chkExcludeCallCust.InvokeRequired)
{
chkExcludeCallCust.Invoke(new MethodInvoker(delegate
{
DataLayer.SetConnectionString(_country);
ds = LoadData(dtfrom.Value.ToString("yyyyMMdd"), dtto.Value.ToString("yyyyMMdd"), (chkExcludeCallCust.Checked ? 1 : 0), txtSearch.Text, 1, Pager.PageSize, false);
}));
}
else
{
DataLayer.SetConnectionString(_country);
ds = LoadData(dtfrom.Value.ToString("yyyyMMdd"), dtto.Value.ToString("yyyyMMdd"), (chkExcludeCallCust.Checked ? 1 : 0), txtSearch.Text, 1, Pager.PageSize, false);
}
if (ds.Tables.Count > 0)
{
if (ds.Tables[0] != null)
{
dtExport = ds.Tables[0];
}
}
if (outlookGrid1.InvokeRequired)
{
outlookGrid1.Invoke(new MethodInvoker(delegate
{
outlookGrid1.BindData(ds, "data");
View = "BoundInvoices";
DataGridViewCellEventArgs evt = new DataGridViewCellEventArgs(2, -1);
object sender = null;
//outlookGrid1_CellClick(sender, evt);
}));
}
else
{
//outlookGrid1.DataSource = ds.Tables[0];
outlookGrid1.BindData(ds, "data");
View = "BoundInvoices";
DataGridViewCellEventArgs evt = new DataGridViewCellEventArgs(2, -1);
object sender = null;
//outlookGrid1_CellClick(sender, evt);
}
if (wfrm.InvokeRequired)
{
wfrm.Invoke(new MethodInvoker(delegate
{
wfrm.Hide();
}));
}
else
{
wfrm.Hide();
}
if (this.InvokeRequired)
{
this.Invoke(new MethodInvoker(delegate {
this.Cursor = Cursors.Default;
btnSearch.Enabled = true;
}));
}
else
{
btnSearch.Enabled = true;
this.Cursor = Cursors.Default;
}
}
在表单加载时,我实例化了一个无边界窗口,如:
WaitForm wfrm = null;
public Feedback(string country)
{
InitializeComponent();
wfrm = new WaitForm();
}
我还为这个窗口设置了更多的属性,比如:
startposition = CenterScreen
showinicon=false
showintaskbar=false
formboderstyle=none
CCD_ 1仅在我第一次点击搜索按钮时显示。我不明白如果第二次点击搜索按键,为什么CCD_ 2没有显示。
另一个问题是WaitForm
上有一个PictureBox
,它被分配了一个动画GIF。第一次显示WaitForm
时,动画没有播放。为什么当我显示WinForm时动画没有播放?
请告诉我,每当我单击搜索按钮时,为了显示WaitForm
,我需要更改代码。我也想知道如何在WaitForm
的PictureBox
中制作GIF动画。
启动一个线程并将所有内容调用回GUI线程完全是无稽之谈。DoEvents是代码气味的指示器。将您的调用捆绑为创建一个大型开销的调用
将您的代码更改为这样的代码:
private void btnSearch_Click(object sender, EventArgs e)
{
this.btnSearch.Enabled = false;
this.Cursor = Cursors.WaitCursor;
this.wfrm.Show();
Thread t = new Thread(this.Search);
t.Start();
}
private void Search()
{
while (isWorking)
{
DoHeavyWork();
this.Invoke(new Action(ReportToWaitForm);
}
this.Invoke(new Action(() =>
{
this.btnSearch.Enabled = true;
this.Cursor = Cursors.Default;
this.wfrm.Hide();
}));
}