【发布时间】:2011-03-04 04:53:15
【问题描述】:
在 Windows 窗体中,我有一个搜索框,它触发一个事件来搜索远程数据库并显示一些结果。查询非常快,通常只有几分之一秒,但如果延迟很明显,表单的状态栏中会有一个进度条和标签。当用户点击“搜索”时,状态标签应该会出现,并且进度条会显示一些进度。然后当结果回来时,标签应该消失并且进度条应该是完整的。非常基本的回应。
问题是,我无法让这些操作按此顺序发生。使用下面的代码,我单击“搜索”,直到显示结果之前什么都没有发生,然后进度条从 0 填充到 100。标签永远不会出现。我什至在事件发生后立即输入了一个睡眠命令,以确保我不仅错过了它,而且好像前两条语句没有被执行。我在这里做错了什么?
private void searchButton_Click(object sender, EventArgs e)
{
toolStripStatusLabel1.Visible = true;
toolStripProgressBar1.Value = 20;
m_changeRequestedEvents.Fire<String>("SearchTerm", searchTextBox.Text);
toolStripProgressBar1.Value = 100;
toolStripStatusLabel1.Visible = false;
}
【问题讨论】:
-
这个 Fire 方法是否会启动另一个线程来进行数据库查询?如果没有,你永远看不到标签的原因是你在同一个线程上做所有事情。在 Windows 窗体中,主线程单独负责绘制窗口和内容。如果它挂起执行 ADO.NET 的东西,那么它就不能很好地解决重新绘制标签的问题。当它返回为控件的布局/绘制事件提供服务时,它已经完成了查询并将其设置回不可见。
-
不,这是一个单线程应用程序。该事件从另一个类运行数据库查询,然后向 UI 触发另一个事件以更新结果表。我知道它在运行查询时无法重新绘制,但鉴于上面的代码,我认为它会部分填充栏并显示标签 before 做后端的东西,然后执行最后一个完成后 2 行。
-
在 searchButton_Click() 完成之前,UI 不会更新。您需要在另一个线程上运行查询。查看 BackgroundWorker。
标签: c# winforms events progress-bar statusbar