【问题标题】: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);
          }
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-05
        • 1970-01-01
        • 1970-01-01
        • 2011-01-16
        • 1970-01-01
        相关资源
        最近更新 更多