1

此代码允许表单在加载数据之前加载,但表单上的某些组件(例如按钮和 datagridview 本身)在加载数据之前是“不可见的”。

我该如何解决这个问题?

    private void Form1_Load(object sender, EventArgs e)
    {
        Thread t = new Thread(new ThreadStart(delegate()
        {
            this.Invoke(new MyDelegate(delegate()
            {               
                ReadXml(path);
                Bind();
           }));              
        }));

        t.Start();
     }

    private void Bind()
    {
        dataGridView1.DataSource = table;
    }

我也有这个更好的其他代码,但需要我使用 2 个新线程。这不可能是最好的方法,不是吗?

    private void Form1_Load(object sender, EventArgs e)
    {
        Thread t = new Thread(new ThreadStart(delegate()
          {
              this.Invoke(new InvokeDelegate(delegate()
              {
                  Thread t2 = new Thread(new ThreadStart(delegate()
                  {
                      ReadXml(path);
                  }));
                  t2.Start();
                  t2.Join();
                  Bind();
              }));
          }));

        t.Start();
    }
4

2 回答 2

2

表单计时器(不是系统计时器)将在触发之前让所有其他消息处理。

只需给它一个 100-250 毫秒的间隔;在设计器中将其设置为 enabled=false;在 form_load 事件中将其设置为 enabled=true。在 timer_tick 事件中使第一行 timer.enabled = false。之后(仍在滴答事件中)加载您的网格。

于 2012-08-15T20:14:11.400 回答
1

如果您使用 BeginInvoke() 而不是 Invoke(),则委托中的代码将在当前 UI 线程上执行,但直到所有当前 UI 工作待处理完成(如当前的 Form1_Load 调用)后才会发生。Invoke 是一个同步调用,所以这就是你需要线程的原因。

   void Form1_Load(object sender, EventArgs e)
    {
        this.BeginInvoke(new MyDelegate(delegate()
        {
            ReadXml(path);
            Bind();
        }));
    }
于 2012-08-16T03:06:57.417 回答