我已尝试覆盖OnLoad事件,但在此方法完成之前,表单已被绘制。我正在调用base.OnLoad方法。但是,在活动期间,表格部分被绘制(看到文物)。我注意到这一点是因为我正在访问数据库并且需要一些时间。在这种情况下,我得到一些数据并将其绑定到表单的控件。请不要告诉我使用单独的线程。为简单起见,我宁愿在加载数据时显示一个忙碌的光标。
更新:
好吧,我认为你们/ gals已经说服了我。我将使用一个单独的线程。我不知道BackgroundWorker,它很容易实现。现在我的表单正在快速加载。然后,突然我的组合框被填充。但是,我想阻止用户在填充之前点击组合。使用Winforms执行此操作的最佳方式/标准方法是什么?有没有办法在后台工作完成之前关闭表单中的输入事件?
答案 0 :(得分:2)
我建议您在开始加载之前使用Loading
标签覆盖表单。
答案 1 :(得分:2)
您应该能够在调用IntializeComponent()
之前将加载放在构造函数代码中来解决问题。此时,尚未创建表单上的控件(因为这是InitializeComponent
所做的)。
但是,在此阶段尚未显示该表格。如果你想显示一个空白表格,那么我认为一个可能的解决方案(我没有尝试过,但我认为它应该有效)将是调用this.Show()
(以显示表单)和{{1}让WinForms处理事件并显示表单。
答案 2 :(得分:1)
您可以尝试在表单的构造函数中执行昂贵的操作,以便在显示表单时,它已经拥有了渲染所需的数据。另请参阅SuspendLayout
/ ResumeLayout
方法。
但是这些解决方案都不会像使用不同的线程来执行昂贵的操作一样优雅。
答案 3 :(得分:0)
我不确定这是否有帮助,但在Move
之前调用Load
事件。
答案 4 :(得分:0)
显示的事件对此有利。您的表单将完全显示,然后触发显示的事件。这将为用户提供一个干净的屏幕,而无需在加载数据时部分绘制字段。
在你的Shown事件处理程序中,打开沙漏,完成工作,然后关闭沙漏。
答案 5 :(得分:0)
ComboBox
有一个BeginUpdate()
和EndUpdate()
,可以在向控件添加大量数据或慢速数据时调用。表单上的SuspendLayout()
和'ResumeLayout()`也可能有助于您的重绘问题。
如果您只想阻止用户点击它,您也可以禁用该控件。如果禁用表单本身,则所有包含的控件也将被禁用。
如果您正在使用后台线程,则必须确保在启动线程之前从主UI线程调用这些线程,并在后台工作线程完成时再次从主UI线程调用这些线程。