Фоновый рабочий с индикатором выполнения

Я пытаюсь получить ProgressBar с прогрессом преобразования набора данных в Excel с помощью BackgroundWorker. Проблема в том, что работа выполняется в классе, отличном от ProgressBar, и у меня возникают трудности с вызовом worker.ReportProgress(...) из моего цикла. Извините, если это легко, но я новичок в С#, пробовал это весь день и просто не могу понять это правильно. Ваша помощь была бы ОЧЕНЬ оценена.

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;
        }

        // ...
    }
}

person user1171437    schedule 27.01.2012    source источник
comment
Где находится предложение catch вашего try-catch в методе btnOpen_Click(...)?   -  person Samuel Slade    schedule 27.01.2012
comment
Пожалуйста, убедитесь, что вы принимаете ответ, если он приведет к решению вашей проблемы; и проголосуйте за все, что вы нашли полезным.   -  person Samuel Slade    schedule 28.01.2012
comment
Именно там я просто не включил его сюда, чтобы сделать сортировщик образцов кода   -  person user1171437    schedule 30.01.2012


Ответы (2)


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

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

person Samuel Slade    schedule 27.01.2012
comment
GenBulkReceiptsBLL не получает Backgroundworker, когда я передаю его непосредственно в общедоступный DataSet Get_AccountsToBeReceipted (DataSet dsImport, BackgroundWorker worker). Также, когда я передаю экземпляр BackgroundWorker конструктору GenBulkReceiptsBLL. Буду признателен за пример, если это возможно. - person user1171437; 27.01.2012
comment
Извините, долгий день, просто нужна ссылка на использование - person user1171437; 27.01.2012
comment
Пока нет, индикатор выполнения все еще не прогрессирует - person user1171437; 30.01.2012
comment
@user1171437 user1171437 Было бы полезно, если бы вы опубликовали свой измененный код. Но, по предположению (и из приведенного выше кода), я бы предположил, что у пользовательского интерфейса нет времени для обновления визуальных эффектов - следовательно, нет обновлений прогресса. Вам нужно будет разрешить обновление пользовательского интерфейса после каждого вызова метода прогрессии. Лучшим способом для этого было бы выполнение операций перемещения прогресса в отдельном потоке. - person Samuel Slade; 30.01.2012
comment
Как бы я это сделал - person user1171437; 30.01.2012
comment
@ user1171437 На самом деле, я забыл, что BackgroundWorker уже должен работать асинхронно. Вы поставили точку останова на строку, которая обновляет сам ProgressBar, чтобы убедиться, что он действительно выполняется? - person Samuel Slade; 30.01.2012