2

我尝试过覆盖 OnLoad 事件,但在此方法完成之前已绘制表单。我正在调用 base.OnLoad 方法。但是,在活动期间,表格正在部分绘制(看到工件)。我注意到这一点是因为我正在访问数据库并且需要一些时间。在事件中,我正在获取一些数据并将其绑定到表单的控件。请不要告诉我使用单独的线程。为简单起见,我宁愿在加载数据时只显示一个繁忙的光标。

更新:

好吧,我想你们已经说服了我。我将使用一个单独的线程。我不知道 BackgroundWorker,它很容易实现。现在我的表单正在快速加载。然后,突然之间,我的组合框被填充了。但是,我想阻止用户在组合被填充之前点击它们。使用 Winforms 执行此操作的最佳方式/标准方式是什么?有没有办法在后台工作人员完成之前关闭表单中的输入事件?

4

6 回答 6

2

我建议您Loading在开始加载之前用标签覆盖表单。

于 2010-09-21T16:09:31.993 回答
2

您应该能够通过在调用IntializeComponent(). 此时,尚未创建窗体上的控件(因为这就是这样InitializeComponent做的)。

然而,在这个阶段,表格也是不可见的。如果你想显示一个空白表单,那么我认为一个可能的解决方案(我没有尝试过,但我认为它应该可以工作)是调用this.Show()(显示表单)并Application.DoEvents()让 WinForms 处理事件并显示表单.

于 2010-09-21T16:28:12.580 回答
1

您可以尝试在表单的构造函数中执行昂贵的操作,以便在显示表单时,它已经拥有需要呈现的数据。还要查看SuspendLayout/ResumeLayout方法。

但是这些解决方案都不会像使用不同的线程来执行昂贵的操作那样优雅。

于 2010-09-21T16:18:42.753 回答
0

我不确定这是否有帮助,但该Move事件是在之前调用的Load

于 2010-09-21T16:10:54.847 回答
0

Shown 事件对此有好处。您的表单将完全显示,然后触发 Shown 事件。这将在您加载数据时为用户提供一个没有部分绘制字段的干净屏幕。

在 Shown 事件处理程序中,打开沙漏,做你的工作,然后关闭沙漏。

于 2010-09-21T16:33:26.050 回答
0

ComboBox向控件添加大量数据或慢速数据时,可以调用 BeginUpdate()。表单上的“ResumeLayout()”也可以帮助您解决重绘问题。EndUpdate()SuspendLayout()

如果您只想阻止用户单击它,您也可以禁用该控件。如果禁用表单本身,所有包含的控件也将被禁用。

如果您使用后台线程,则必须确保在启动线程之前从主 UI 线程调用这些线程,并在后台工作程序完成后再次从主 UI 线程调用。

于 2010-09-22T15:24:32.130 回答