我有一个网格,当双击一行时,表单被加载.但是必须加载大量数据,所以我想显示一个带有文本'loading,please wait ...'的简单表单.当所有装载完成后,表格必须消失.
这就是我现在所拥有的,但它不起作用:
调用包含大量数据的表单的代码:
FormWithLotData form = new FormWithLotData();
form.ShowDialog(this);
Run Code Online (Sandbox Code Playgroud)
FormWithLotData的构造函数:
// Show load form
FormIsLoading frm = new FormIsLoading();
_CloseLoadForm closeForm = new _CloseLoadForm(frm.Close);
System.Threading.Thread thread = new System.Threading.Thread(frm.Show);
thread.Start();
InitializeComponent();
this.Visible = false;
LoadAllData();
this.Visible = true;
// Close load form
Invoke(closeForm);
Run Code Online (Sandbox Code Playgroud)
希望你能帮助我.
编辑:我想在加载表单上显示动画GIF.
解决方案:我创建了一个后台工作者.DoWork事件处理所有加载,并使用invoke()方法将节点添加到树视图中.现在,GUI不会挂起,用户也不知道应用程序正在挂起.
小智 6
您需要撤消您的代码.
FormWithLotData的构造函数在UI线程中运行.这是必须显示FormIsLoading表单的主题.因此,不要尝试使用新线程显示此表单,而是使用它加载数据.
其他人建议的DoEvents方式最容易实现,并且(可能?从未自己完成)可能效果很好.
更好的模式是在工作线程上进行数据加载.在显示FormWithLotData之前,开始在后台线程上加载数据并显示"加载"对话框.加载数据的方法应该在"加载"对话框中有一个回调方法,以指示何时应该关闭().一旦关闭,您就可以构建一个新的FWLD,将已经加载的数据传递给它,并显示它.
在调用表单后尝试加载数据会将UI与数据操作混合在一起,迫使您的表单不仅要负责UI,还要负责数据检索.对于KISS和单一责任不利,imho.
更新后,似乎DoEvents将成为您问题的唯一真正答案,但有一些警告.
在构建树时,您将无法以模式显示另一个表单.你仍然需要在表单的构造函数中做繁重的工作.您仍然需要隐藏您的主表单和Show()(而不是ShowDialog)您的加载表单.在构建树时,您还必须在每个可能的时刻调用DoEvents .它不是一个优雅的解决方案,但它可能是你最好的选择.
怎么样 ...
FormIsLoading frm = new FormIsLoading();
frm.Show();
Application.DoEvents();
// ... load data ...
frm.Close();
Run Code Online (Sandbox Code Playgroud)