0

我正在尝试更新后台工作人员表单上的一组标签。这是我的代码:

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()];
        }
    }
4

2 回答 2

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();
    }
}
于 2014-07-02T04:47:35.310 回答
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;
于 2014-07-02T04:59:40.353 回答