简体   繁体   English

C#帮助填充DataGridView的BackGroundWorker进程的基本教学示例

[英]C# Help with a basic pedagogic example of a BackGroundWorker process populating a DataGridView

Scenario: 场景:

I have a windows form that holds a DataGridWiew with 3 pre-defined columns. 我有一个窗体,它包含一个带有3个预定义列的DataGridWiew I have 3 variables declared outside the function and assigned to inside the function. 我在函数外部声明了3个变量并分配到函数内部。 I have a function that enumerates stuff and puts it in the 3 columns, line by line: 我有一个枚举东西的函数,并将它放在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); 
    }
}

What I want to do, is to execute this function from a BackGroundWorker process, so that the GUI of the application will be smooth and responsive. 我想要做的是从BackGroundWorker进程执行此功能,以便应用程序的GUI流畅和响应。 I have read up on backgroundworkers but I am having trouble relating, because all examples seems to be of entirely different scenarios and most of them are overwhelmingly complex. 我已经阅读了背景工作者,但我遇到了麻烦,因为所有的例子似乎都是完全不同的情况,而且大多数情况都非常复杂。

Can some helpful pedagogic soul help me and others with a very basic example of how to get this to work in the simplest way possible. 一些有用的教育灵魂可以帮助我和其他人有一个非常基本的例子,说明如何以最简单的方式使其工作。 Thanks. 谢谢。

I would use something like this (very sketchy and untested): 我会使用这样的东西(非常粗略和未经测试):

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

Here is an example: 这是一个例子:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM