我正在使用后台工作程序运行c#代码。我通过使用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();
}
答案 0 :(得分: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);
答案 1 :(得分: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
变量在每次迭代中绑定到不同的值,因此您在最后一次迭代时获得了行的值。
this answer以及Eric Lipperts blog中解释了这一点。
答案 2 :(得分:-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 row
foreach
变量,然后在DoWork
方法中提取必要的数据。