0

我在后台运行 ac# 代码。我通过有一个 foreach 循环和在循环内传递 foreach 变量作为 Backgroundworker 的参数来实现它。但问题是,每当我只运行一个随机值时,gridview 中的最后一行很可能是作为参数传递的。代码是这里

foreach (DataGridViewRow row in dataGridView3.Rows)
{
    BackgroundWorker worker = new BackgroundWorker();
    worker.WorkerSupportsCancellation = true;
    worker.DoWork += delegate
    {
        data = dataGridView3.Rows[row.Index].Cells[0].Value.ToString();
        rowindex = row.Index;
        data1 = ros[0].Cells[0].Value.ToString();
    };

    worker.RunWorkerAync();
}
4

3 回答 3

2

尝试发送参数为row

worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
    DataGridViewRow  dgr = (DataGridViewRow)args.Argument;
    data = dataGridView3.Rows[dgr.Index].Cells[0].Value.ToString();
    rowindex = dgr.Index;
    data1 = dgr[0].Cells[0].Value.ToString();
};

worker.RunWorkerAsync(row);
于 2013-06-15T16:54:23.813 回答
1

除了@Damith 的回答,您还可以在本地范围内捕获 foreach 变量。

foreach (DataGridViewRow row in dataGridView3.Rows)
{
    DataGridViewRow copy = row; // captured!
    BackgroundWorker worker = new BackgroundWorker();
    worker.WorkerSupportsCancellation = true;
    worker.DoWork += delegate
    {
        data = dataGridView3.Rows[copy.Index].Cells[0].Value.ToString();
        rowindex = copy.Index;
        data1 = copy[0].Cells[0].Value.ToString();
    };

    worker.RunWorkerAync();
}

这是因为row变量在每次迭代中绑定到不同的值,因此您在最后一次迭代中获得 row 的值。

此答案以及Eric Lipperts 博客中对此进行了解释。

于 2013-06-15T17:28:21.737 回答
-1

它看起来像线

data = dataGridView3.Rows[row.Index].Cells[0].Value.ToString();

可以修改为:

data = row.Cells[0].Value.ToString();

因为它有点违背了foreach声明的全部目的。此外,以下行似乎有错字:

data1 = ros[0].Cells[0].Value.ToString();

我不确定您打算data1包含什么,但您可能需要考虑简单地从语句中传递BackgroundWorker变量DataGridView rowforeach然后在DoWork方法中提取必要的数据。

于 2013-06-15T16:41:03.357 回答