2012-01-27 14 views
0

BackgroundWorkerを使用してデータセットの進捗状況をExcelに変換して、ProgressBarを取得しようとしています。問題は、作業がProgressBarとは異なるクラスで実行されていて、私のループ内からworker.ReportProgress(...)を呼び出すのが難しいことです。これは簡単なことですが、申し訳ありませんが、私はC#を初めて使っていて、これを一日中試してきました。あなたの助けが高く評価されます。バックグラウンドプログレスバーを持つワーカー

namespace CLT 
{ 
    public partial class GenBulkReceipts : UserControl 
    { 
     private void btnOpen_Click(object sender, EventArgs e) 
     { 
      Cursor.Current = Cursors.WaitCursor; 
      try 
      { 
       OpenFile(); 
      } 

      Cursor.Current = Cursors.Default; 
     } 
     private void OpenFile() 

     { 
      if (dsEx1.Tables[0].Rows.Count > 0) 
      { 
        backgroundWorker1.RunWorkerAsync(dsEx1); 
      } 
     } 

     public void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
     { 
      BackgroundWorker worker = sender as BackgroundWorker; 
      DataSet ImportDataSet = e.Argument as DataSet; 
      AccountsToBeImported = new BLLService().Get_AccountsToBeReceipted(ImportDataSet); 
     } 

     public void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
     { 
      this.progressBar1.Value = e.ProgressPercentage; 
     } 

     // ... 
    } 
} 

namespace BLL 
{ 
    class GenBulkReceiptsBLL 
    { 
     public DataSet Get_AccountsToBeReceipted(DataSet dsImport) 
     { 
      DataSet dsReturn = AccountsDAL.QGenReceiptAccounts(0,0,"");//Kry Skoon DataSet wat ge-populate moet word 

      CLT.GenBulkReceipts pb = new CLT.GenBulkReceipts(); 
      int TotalRows = dsImport.Tables[0].Rows.Count; 
      //pb.LoadProgressBar(TotalRows); 
      int calc = 1; 
      int ProgressPercentage; 

      foreach (DataRow dr in dsImport.Tables[0].Rows) 
      { 
       ProgressPercentage = (calc/TotalRows) * 100; 

       //This is the problem as I need to let my Progressbar progress here but I am not sure how 
       //pb.worker.ReportProgress(ProgressPercentage); 
      } 

      return dsReturn; 
     } 

     // ... 
    } 
} 
+0

'btnOpen_Click(...)'メソッドにある 'try-catch'の' catch'節はどこにありますか? –

+0

問題の解決につながる場合は、回答を受け入れるようにしてください。あなたが有用であると判明したものを投票してください。 –

+0

ここにコードサンプルソータを作成するためにここに含めなかっただけです – user1171437

答えて

0

クラスGenBulkReceiptsBLLにはBackgroundWorkerインスタンスへの参照が必要です。これはさまざまな方法で実現できます。そのような提案の1つは、クラスをインスタンス化するときに参照をクラスに渡すことです。例えば

GenBulkReceiptsGenBulkReceiptsBLLをインスタンス化するクラスであることから、その後、GenBulkReceiptsBLLのコンストラクタでは、あなたは現在GenBulkReceiptsに使用されているBackgroundWorkerのインスタンスを渡すことができます。これによりReportProcess(...)に直接電話することができます。あるいは、参照を直接Get_AccountsToBeReceipted(...)メソッドに渡すこともできます。

+0

GenBulkReceiptsBLLはパブリックDataSet Get_AccountsToBeReceipted(DataSet dsImport、BackgroundWorkerワーカー)に直接渡すとBackgroundworkerを取得しません。また、BackgroundWorkerのインスタンスをGenBulkReceiptsBLLコンストラクターに渡すと、可能であれば、私はその例を感謝します。 – user1171437

+0

ご迷惑をおかけして申し訳ございませんが、参照番号 – user1171437

+0

@ user1171437を使用する必要があります。 –

1

あなたのworkerGet_AccountsToBeReceiptedメソッドに渡す必要があります - それは、その後BackgroundWorker.ReportProgressを呼び出すことができます:あなたはGenBulkReceiptsBLLは、独自のProgressイベントを持たせることができ、また

// In GenBulkReceipts 
public void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    BackgroundWorker worker = sender as BackgroundWorker; 
    DataSet importDataSet = e.Argument as DataSet; 
    AccountsToBeImported = 
     new BLLService().Get_AccountsToBeReceipted(importDataSet, worker); 
} 

// In GenBulkReceiptsBLL 
public DataSet Get_AccountsToBeReceipted(DataSet dsImport, 
             BackgroundWorker worker) 
{ 
    ... 
    worker.ReportProgress(...); 
} 

を、とのことを購読しますGenBulkReceipts - それはもっと複雑になります。

+0

上記の例のように、DataSet Get_AccountsToBeReceipted(DataSet dsImport、BackgroundWorkerワーカー)BackgroundworkerはDataSetと同じように選択されていません – user1171437

+0

@ user1171437:あなたは "拾われていない"という意味です。 –

+0

申し訳ありません、長い一日だけ参照を使用する必要があります – user1171437

関連する問題