2013-01-23 29 views
2

我正在尝试一些非常基本的东西。刷新窗体,即使不是活动窗口

我在我的Windows窗体上有3个标签,我想从数据库中的3个不同的查询中填充,还要显示用户正在发生的事情,我想在数据可用时显示每个标签来自相应的查询。

要做到这一点,我可以使用:

Form.ActiveForm.Refresh(); 

然而,如果用户点击桌面上的任何其他窗口,该命令将失败,并“对象未设置”错误。

有什么办法可以刷新窗体上的标签,即使表单窗口不是活动窗口?

// Breach within next hour 
DataTable tbBreach = (get info from database) 
tbBreach.DefaultView.Sort = "Assignee ASC"; 
dgBreach.DataSource = tbBreach; 
lbBreach2.Text = tbBreach.Rows.Count.ToString(); 
Form.ActiveForm.Refresh(); //Would like to update this form field now, and show it on the form 

// Breach within next 24 hour 
DataTable tbBreach24 = (get info from database) 
tbBreach24.DefaultView.Sort = "Assignee ASC"; 
dgBreach24.DataSource = tbBreach24; 
lbBreach24.Text = tbBreach24.Rows.Count.ToString(); 
Form.ActiveForm.Refresh(); 

谢谢

马克

+1

原则上,不需要刷新,因为只要设置Text属性,标签就会自动刷新。您是否尝试删除刷新行? – digEmAll

+0

嗨@digEmAll - 是的 - 如果我删除它们,标签似乎不会更新,直到函数结束(上面的是当有人点击“更新数字”按钮时执行),就好像更新表单(或者至少刷新它)根本没有完成,直到函数完成 - 这就是为什么我认为我可以在每个标签之后添加Refresh(),但是这会导致错误,如果用户没有窗口,窗体是on,in focus。非常感谢。 – Mark

回答

3

标签将自动在拟订结束被刷新。

您可能想强制更新以在更新过程中更新标签,并且您可以简单地使用this.Refresh(),因为我怀疑该方法位于表单类中。

但是,当您需要长时间阐述并且需要保持UI已更新且被动(即未冻结)时,建议的方法是避免在UI线程上进行细化,而是使用BackGroundWorker将工作委托给另一个线程。

Here's BackGroundWorker使用的一个工作示例。

+0

添加了BackGroundWorker的示例。 – digEmAll