C # Winform Progressbar с Backgroundworker и OLEDB Excel с возможностью обработки данных - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть приложение Winform, которое выполняет несколько запросов в Excel-Datatables с oleDB. Пока это работает, но теперь я хочу добавить индикатор выполнения, который информирует пользователя о том, что приложение не зависает, а загружает необходимую информацию на основе ввода пользователя.

Использование Backgroundworker и новой задачи похоже на то, что индикатор выполнения и весь пользовательский интерфейс замирают.

private void updateButton_Click(object sender, EventArgs e)
    {            
        progressBar1.Visible = true;
        progressBar1.Style = ProgressBarStyle.Marquee;

        Task t1 = Task.Factory.StartNew(() => QueryToExcel());
        Task.WaitAll(t1);
        progressBar1.Visible = false;

    }

private void QueryToExcel()
{
//doing some data manipulation with LINQ, oleDB etc. 
//and finally stored in datatable FinalTable
datagridview1.datasource = FinalTable;
datagridview1.Update();
}

EDIT:

Я полагаю, что проблема в том, что я устанавливаю datagridview.datasource = Datatable во время работы индикатора выполнения, поэтому все не отвечает. Итак, я хочу, чтобы Backgroundworker запустил манипулирование данными и поместил окончательный источник данных в качестве источника данных, в то время как он выполняется, индикатор выполнения должен просто продолжить этот этап. Если фоновый рабочий закончил, то индикатор выполнения должен просто исчезнуть ...

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {            
        QueryToExcel();
    }

private void updateButton_Click(object sender, EventArgs e)
    {
        progressBar1.Visible = true;
        StartBackgroundWork();
    }

private void StartBackgroundWork()
    {
        if (Application.RenderWithVisualStyles)
            progressBar1.Style = ProgressBarStyle.Marquee;
        else
        {
            progressBar1.Style = ProgressBarStyle.Continuous;
            progressBar1.Maximum = 100;
            progressBar1.Value = 0;
        }
        backgroundWorker1.RunWorkerAsync();
    }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        progressBar1.Value = 0;
        dataGridView1.Update();
        progressBar1.Visible = false;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...