gpt4 book ai didi

c# - Winforms:如何显示 "loading"表单?

转载 作者:太空狗 更新时间:2023-10-30 00:09:10 25 4
gpt4 key购买 nike

我有一个网格,双击一行时会加载一个表单。但是必须加载大量数据,所以我想显示一个简单的表单,其中包含文本“正在加载,请稍候...”。当所有加载完成后,表单必须消失。

这是我现在拥有的,但它不起作用:

调用包含大量数据的表单的代码:

FormWithLotData form = new FormWithLotData();
form.ShowDialog(this);

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);

希望你能帮帮我。

编辑:我想在加载表单上显示动画 gif。

解决方案:我创建了一个后台 worker 。 DoWork 事件处理所有加载,并通过使用 invoke() 方法将节点添加到 TreeView 。现在,GUI 没有挂起,用户也不知道应用程序挂起。

最佳答案

您需要反转您的代码。

FormWithLotData 的构造函数在 UI 线程中运行。这是必须显示您的 FormIsLoading 表单的线程。因此,与其尝试使用新线程显示此表单,不如使用它加载数据。

其他人建议的 DoEvents 方法是最容易实现的,并且(可能?我自己从未做过)可能效果很好。

更好的模式是在工作线程上加载数据。在显示 FormWithLotData 之前,开始在后台线程上加载数据并显示加载对话框。加载数据的方法应该有一个回调方法到 Loading 对话框中,以在它应该 Close() 时发出信号。一旦关闭,您就可以构建一个新的 FWLD,将已加载的数据传递给它,然后显示它。

在调用表单后尝试加载数据会将您的 UI 与数据操作混合在一起,迫使您的表单不仅负责 UI,还负责数据检索。不利于 KISS 和单一职责,恕我直言。


更新后,似乎 DoEvents 将成为您问题的唯一真正答案,但有一些警告。

在构建树时,您将无法以模态方式显示另一种形式。您仍然需要在表单的构造函数中完成繁重的工作。您仍然需要隐藏您的主窗体和 Show()(不是 ShowDialog)您的加载窗体。在构建树时,您还必须在每一个可能的时刻调用 DoEvents。这并不是一个优雅的解决方案,但它可能是您此时的最佳选择。

关于c# - Winforms:如何显示 "loading"表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2788736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com