我正在尝试更新背景工作者表单上的标签数组。这是我的代码:
for (int i = 0; i < 6; i++)
{
if (this.InvokeRequired)
{
this.Invoke((MethodInvoker)delegate
{
arrLabel[i].Text = values[i].ToString();
});
}
else
{
arrLabel[i].Text = values[i].ToString();
}
}
这不起作用,但如果我尝试更改每个标签的文本属性而不是数组,则可以正常工作。我怎样才能解决这个问题?还有一种更短/更好的方式来更新后台工作者的表单控件,而不是我为表单上的每个控件做的事情吗?
编辑:这是我定义数组的方式:
private Label[] arrLabel = new Label[6];
这是我调用分配数组的函数:
private void makeLabelArrays()
{
for (int i = 0; i < 6; i++)
{
arrLabel[i] = (Label)Groupbox1.Controls["label" + (i + 1).ToString()];
}
}
答案 0 :(得分:1)
尝试以下
private delegate void delegateAssignText();
public void AssignText()
{
if (this.InvokeRequired)
{
Invoke(new delegateAssignText(AssignText));
return;
}
for (int i = 0; i < 6; i++)
{
arrLabel[i].Text = values[0].ToString();
}
}
答案 1 :(得分:1)
我假设您的代码看起来像什么;我可能错了。
您可以使用ReportProgress()
方法将两条信息发送回UI线程 - 完整性的百分比(在您的情况下并不真正适用,因此我指定了0)和一些数据(你想要的任何对象,在这种情况下只是一个数字)。
然后,您可以获取ProgressChanged
事件中的数据并执行触及UI的代码。
private List<Label> arrLabel = new List<Label>();
private List<string> values = new List<string>();
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
var bw = (BackgroundWorker)sender;
for (int i = 0; i < 6; i++)
bw.ReportProgress(0, i);
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
var currentIndex = Convert.ToInt32(e.UserState);
arrLabel[currentIndex].Text = values[0].ToString();
}
确保启用报告进度,因为默认情况下已禁用。
backgroundWorker1.WorkerReportsProgress = true;