C#标签文本未更新

C#标签文本未更新,c#,winforms,label,sleep,C#,Winforms,Label,Sleep,我有以下代码: private void button1_Click(object sender, EventArgs e) { var answer = MessageBox.Show( "Do you wish to submit checked items to the ACH bank? \r\n\r\nOnly the items that are checked and have the status 'Entered' will be submitted."

我有以下代码:

private void button1_Click(object sender, EventArgs e)
{
  var answer =
    MessageBox.Show(
      "Do you wish to submit checked items to the ACH bank? \r\n\r\nOnly the items that are checked and have the status 'Entered' will be submitted.",
      "Submit",
      MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question,
      MessageBoxDefaultButton.Button1);

  if (answer != DialogResult.Yes)
    return;

  button1.Enabled = false;
  progressBar1.Maximum = dataGridView1.Rows.Count;
  progressBar1.Minimum = 0;
  progressBar1.Value = 0;
  progressBar1.Step = 1;

  foreach (DataGridViewRow row in dataGridView1.Rows)
  {
    if ((string) row.Cells["Status"].Value == "Entered")
    {
      progressBar1.PerformStep();

      label_Message.Text = @"Sending " + row.Cells["Name"].Value + @" for $" + row.Cells["CheckAmount"].Value + @" to the bank.";
      Thread.Sleep(2000);
    }
  }
  label_Message.Text = @"Complete.";
  button1.Enabled = true;
}
这是我创建的一个测试,用于将端口转移到我的应用程序。一切正常,但正在设置标签_Message.text。它永远不会出现在屏幕上。它正在设置中,我做了一个控制台。写在上面进行验证。它只是没有刷新屏幕。最后我也得到了“完整”的答案


有人有什么想法吗?

此操作在UI线程中执行。UI在完成之前不会更新。要使其在发送过程中更新,您必须在单独的线程中执行发送,并从那里更新标签

您正在UI线程上执行一个冗长的操作。您应该将其移动到后台线程(例如通过
BackgroundWorker
),以便UI线程可以在需要时重新绘制屏幕。您可以欺骗并执行
应用程序.DoEvents
,但我建议您不要这样做

这个问题和答案基本上就是你要问的:

当您在运行用户界面元素的同一线程中进行密集计算/迭代时,通常会发生这种情况。为了解决这个问题,你需要有一个单独的线程来完成这项工作,然后相应地更新标签的值。我会发布一个完整的源代码示例,但我现在不在我的开发机器旁。

在您将UI线程返回到消息循环之前,标签不会重新绘制。尝试Label.Refresh,或者更好的做法是,按照其他海报的建议,尝试将冗长的操作放在后台线程中。

使用Label.Refresh();它节省了很多时间。这对u应该有用。只是为了补充这个答案,我遇到了一个关于启动屏幕表单的问题。 我们有这样的代码:


初始化(这个,SplashScreenImage);
SplashScreen.Show();
//数据库初始化、日志初始化等。
... 进一步在我们的应用程序中。。。
运行(新的MainWindowForm());
中初始化(这是SplashScreenImage)我们更新了一些控件,然后对这些控件运行刷新


公共void初始化(此,SplashScreenImage)
{
...
lblVersion.Text=GetVersionString();
lblEnv.Text=GetEnvironmentString();
//刷新(不工作)
lblVersion.Refresh()
lblEnv.Refresh()
}
不幸的是,这不起作用。这里的问题是,尽管我们显式地调用了
control.Refresh()
,但在调用
control.Refresh
之后调用了
form.show()
。这是行不通的

解决方法很简单:

SplashScreen.Show();//第一次电话秀
SplashScreen.Initialize(这个,SplashScreenImage);//现在contorl.Refresh()可以工作了

我知道这个问题很老,但我也有同样的问题。我尝试了刷新()和其他许多方法,但都没有效果。如果我把文本放在Messagebox.show中,那么它在Messagebox中起作用,但在表单中不起作用,所以我知道我有数据。当我有人等着使用这个应用程序时,我感到非常绝望,我正打算暂时取消这个类,让它工作起来,这时我想到了尝试调用。所以我试过了

Invoke(new Action(() =>
        {
            lbltxt.Text = text;

        }));
目前,它是有效的,但在我找到更好的解决方案之前,仍然不确定这是一个长期的修复还是仅仅是一个石膏