【问题标题】:Add Controls to WinForms dynamically in another Thread在另一个线程中动态地将控件添加到 WinForms
【发布时间】:2009-02-12 20:01:49
【问题描述】:
我有一个包含数据网格视图、绑定源、文件资源管理器控件等的 Winform...
我需要动态地将几个控件(自定义用户控件)添加到面板(如 Panel.Controls.Add(...))。这个过程可能很慢。
我想向用户显示一条消息(等待中)。
最好的方法是什么?我使用 Backgroundworker 但我遇到了问题,我的应用程序没有响应并且 datagridview 没有显示垂直滚动条,还有其他奇怪的事情。
【问题讨论】:
标签:
c#
vb.net
winforms
multithreading
user-interface
【解决方案1】:
线程可能不是您进行此类 gui 操作的最佳选择。所有控件都应该在同一个线程上创建。
而是在表单底部放置一个状态栏控件。在状态栏上,包括一个进度条和一个标签。添加控件时,通过在标签中包含一条消息并递增进度条在状态栏上进行指示。
【解决方案2】:
我怀疑向 WinForm 添加控件可能会很慢。恕我直言,可能会降低性能的是获取绑定到它们的数据。因此,您可以例如在新线程中加载数据,一旦加载,将其绑定到控件:
ThreadPool.QueueUserWorkItem(o =>
{
// Simulate some expensive data fetch.
Thread.Sleep(1000);
string[] data = new[] { "value1", "value2" };
if (InvokeRequired)
{
Action a = () => { listBox1.DataSource = data; };
// Ensure that all UI updates are done on the main thread
Invoke(a);
}
});