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

Invoke()の代わりにBeginInvoke()を使用すると、デリゲートのコードは現在の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 に答える