C # Помощь с базовым педагогическим примером процесса BackGroundWorker, заполняющего DataGridView - PullRequest
5 голосов
/ 09 марта 2010

Сценарий:

У меня есть форма окна, которая содержит DataGridWiew с 3 предопределенными столбцами. У меня есть 3 переменные, объявленные вне функции и назначенные внутри функции. У меня есть функция, которая перечисляет вещи и помещает их в 3 столбца, строка за строкой:

string VARIABLE1;
string VARIABLE2;
string VARIABLE3;

private void FunctionEnumerateStuff()
{
    foreach (StuffObject STUFF in StuffCollection)
    {
       VARIABLE1 = STUFF.SubStuff1.ToString();
       VARIABLE2 = STUFF.SubStuff2.ToString();
       VARIABLE3 = STUFF.SubStuff3.ToString();
       DatagridWiew1.Rows.Add(VALUE1, VALUE2, VALUE3); 
    }
}

Я хочу выполнить эту функцию из процесса BackGroundWorker, чтобы графический интерфейс приложения был плавным и отзывчивым. Я читал о фоновых работниках, но у меня возникают проблемы с их связью, потому что все примеры, по-видимому, имеют совершенно разные сценарии, и большинство из них чрезвычайно сложны.

Может ли какая-то полезная педагогическая душа помочь мне и другим с очень простым примером того, как заставить это работать самым простым способом. Благодаря.

Ответы [ 2 ]

1 голос
/ 22 марта 2010

Вот пример:

class Form1 : Form
{
    private BackgroundWorker Worker { get; set; }

    public Form1()
    {
        Worker = new BackgroundWorker();
        Worker.WorkerSupportsCancellation = true;
        Worker.DoWork += OnWorkerDoWork;
        Worker.RunWorkerCompleted += OnWorkerRunWorkerCompleted;

        // at some point start the worker.
        Worker.RunWorkerAsync();
    }

    void OnWorkerDoWork(object sender, RunWorkerCompletedEventArgs e)
    {
        foreach(var data in someData)
        {
            // if cancelled
            if (e.Cancelled)
                return;

            AddDataToColumn(someData.Var1, someData, Var2, someData.Var3);
        }
    }

    void OnWorkerRunWorkerCompleted(object sender, DoWorkEventArgs e)
    {

    }

    private delegate void AddDataToColumnDelegate(string var1, string var2, string var3);
    private void AddDataToColumn(string var1, string var2, string var3)
    {
        // check if cross-thread operation
        if (InvokeRequired)
        {
            Invoke(new AddDataToColumnDelegate(AddDataToColumn), var1, var2, var3);
            return;
        }

        // Add data to column
        dataGridView1.Rows.Add(var1, var2, var3);
    }
}
1 голос
/ 09 марта 2010

Я бы использовал что-то вроде этого (очень схематично и непроверено):

  private void bgw_DoWork(object sender, DoWorkEventArgs e)
    {
        var list = new List<SomeRowType>();

        foreach (StuffObject STUFF in StuffCollection)
        {
            VARIABLE1 = STUFF.SubStuff1.ToString();
            VARIABLE2 = STUFF.SubStuff2.ToString();
            VARIABLE3 = STUFF.SubStuff3.ToString();
            //DatagridWiew1.Rows.Add(VALUE1, VALUE2, VALUE3);
            list.Add(new SomeRowType(VALUE1, VALUE2, VALUE3));  //probably meant: VARIABLEn
        }
        e.Result = list;
    }

    private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if (e.Error != null)
        {
        }
        else
        {
            var list = (List<SomeRowType>)e.Result;
            DatagridWiew1.DataSource = list;
        }
    }
...