2011-07-18 7 views
0

C#excelアドインにプログレスバーを追加しようとしていますが、プログレスバーは表示されますが、実行が完了するまで進捗状況は示されません。C#windowsはバックグラウンドワーカーとプログレスバーを形成します

これらは、Windowsフォームクラス関数です:

public void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     for (int i = 0; i < 100; i++) 
     { 

      Thread.Sleep(100); 

      backgroundWorker1.ReportProgress(i); //run in back thread 


     } 

    } 



    public void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) //call back method 
    { 

     progressBar1.Value = e.ProgressPercentage; 

    } 

    public void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) //call back method 
    { 

     progressBar1.Value = progressBar1.Maximum; 

    } 

これは私がボタンに追加の関数を呼び出す方法です:

private void buttonClicked(object sender, RibbonControlEventArgs e) 
    { 
     AddInPlanView.Form1 pBar = new AddInPlanView.Form1(); 

     pBar.Visible = true; 

     pBar.backgroundWorker1.WorkerReportsProgress = true; 

     pBar.backgroundWorker1.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(pBar.backgroundWorker1_ProgressChanged); 

     pBar.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(pBar.backgroundWorker1_DoWork); 

     pBar.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(pBar.backgroundWorker1_RunWorkerCompleted); 

     pBar.backgroundWorker1.RunWorkerAsync(); 

     FUNCTIONTORUN(); 

     pBar.Visible = false; 

    } 

私はこれを変更する必要がありますどのように進行するようにFUNCTIONTORUN()の実行中にバーが機能しなくなりませんか?プログレスバーは、Visual Studioデザイナーを使用して初期化されます。フォームクラス内のprogressbarオブジェクトの名前はprogressbar1です。

ありがとうございます!

答えて

3

進行状況バーのDoWorkイベントはFUNCTIONTORUN()である必要があります。 FUNCTIONTORUN()ReportProgressメソッドを使用する必要があります。

2

FUNCTIONTORUNは何をしますか? UIスレッドをブロックする可能性が非常に高いため、プログレスバーへの更新が戻されるまで表示されません。可能であれば、FUNCTIONTORUNはバックグラウンドワーカーで実行し、進行状況を定期的に報告する必要があり、それがプログレスバーを更新する場所です。

0

私は次のステートメントを拡張したいと思います。もし私が間違っているなら、Matt Greerは私を修正することができます。

FUNCTIONTORUNとは何ですか? UIスレッドをブロックする可能性が非常に高く、 が返されるまでプログレスバーの更新が表示されない可能性があります。おそらくFUNCTIONTORUNはバックグラウンドで実行する必要があります。 作業者は定期的に進捗状況を報告しなければならないので、進捗バーを更新するのは です。私は彼がこの手段によって信じることはあなたが FUNCTIONTORUN()内progressBar1.Valueを更新する必要がある

でも同様の方法を使用できます。

関連する問題