Фоновый рабочий с индикатором выполнения - PullRequest
0 голосов
/ 27 января 2012

Я пытаюсь получить 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;
        }

        // ...
    }
}

Ответы [ 2 ]

1 голос
/ 27 января 2012

Вам нужно будет передать 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 голосов
/ 27 января 2012

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

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

...