2012-01-27 2 views
0

Я пытаюсь получить ProgressBar с ходом преобразования данных в Excel с помощью BackgroundWorker. Проблема в том, что работа выполняется в другом классе, чем в 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

Где 'catch' предложение вашего' try-catch' находится в методе 'btnOpen_Click (...)'? –

+0

Пожалуйста, убедитесь, что вы принимаете ответ, если это приведет к разрешению проблемы; и голосуйте за то, что вы сочли полезным. –

+0

Здесь я просто не включил его здесь, чтобы сделать сортировщик образцов кода – user1171437

ответ

0

Ваш класс GenBulkReceiptsBLL нуждается в некоторой ссылке на экземпляр BackgroundWorker. Вы можете достичь этого разными способами. Одним из таких предложений было бы передать ссылку на класс при его создании.

Например, так как GenBulkReceipts класс, который конкретизирует GenBulkReceiptsBLL, то в конструкторе GenBulkReceiptsBLL, можно передать экземпляр BackgroundWorker, который в настоящее время используется в GenBulkReceipts. Это позволит вам напрямую позвонить ReportProcess(...). Альтернативно, вы можете передать ссылку непосредственно в метод Get_AccountsToBeReceipted(...).

+0

GenBulkReceiptsBLL не берет фонового работника, когда я передаю его непосредственно в общедоступный DataSet Get_AccountsToBeReceipted (DataSet dsImport, работник BackgroundWorker). Также, когда я передаю экземпляр BackgroundWorker в конструктор GenBulkReceiptsBLL. Я был бы признателен, если это возможно. – user1171437

+0

Извините, что мне нужен длинный день, используя ссылку – user1171437

+0

@ user1171437 Я понимаю, что вы сейчас работали? –

1

Вам нужно передать свой worker методу Get_AccountsToBeReceipted - то он может позвонить BackgroundWorker.ReportProgress:

// 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(...); 
} 

В качестве альтернативы, вы можете сделать GenBulkReceiptsBLL иметь свой собственный Progress событие, и подписаться на том, что из GenBulkReceipts - но это было бы сложнее.

+0

Как и в приведенном выше примере, public DataSet Get_AccountsToBeReceipted (DataSet dsImport, BackgroundWorker worker) Фоновертор не выбран таким же, как DataSet – user1171437

+0

@ user1171437: Неясно, что вы подразумеваете под «не подобрали». –

+0

Извините, что длинный день просто нужен с использованием ссылки – user1171437

Смежные вопросы