C# 标签文本未更新

Posted

技术标签:

【中文标题】C# 标签文本未更新【英文标题】:C# Label Text Not Updating 【发布时间】:2011-08-06 13:02:49 【问题描述】:

我有以下代码:

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;

这是我为移植到我的应用程序而创建的测试。一切正常,但设置了 label_Message.text 。它永远不会出现在屏幕上。它正在设置中,我在上面做了一个 console.write 来验证。它只是不刷新屏幕。最后我也得到了“完成”。

有人有什么想法吗?

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

您正在 UI 线程上执行冗长的操作。您应该将其移至后台线程(例如通过BackgroundWorker),以便 UI 线程可以在需要时执行诸如重新绘制屏幕之类的操作。你可以作弊并执行Application.DoEvents,但我真的不建议这样做。

这个问题和答案基本上就是你要问的:Form Not Responding when any other operation performed in C#

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

使用 Label.Refresh();它节省了很多时间。这应该对你有用

【讨论】:

【参考方案6】:

为了补充这个答案,我遇到了启动屏幕表单的问题。 我们有这样的代码:


SplashScreen.Initialize(this, SplashScreenImage);
SplashScreen.Show();

// Db init, log init etc.

... Further in our app ...

Application.Run(new MainWindowForm());

Initialize(this, SplashScreenImage); 中我们更新了一些控件,然后我们对这些控件运行刷新;


public void Initialize(this, SplashScreenImage)

   ...

   lblVersion.Text = GetVersionString();
   lblEnv.Text = GetEnvironmentString();

   // Refresh (does not work)
   lblVersion.Refresh()
   lblEnv.Refresh()


很遗憾,这不起作用。这里的问题是,虽然我们显式调用了control.Refresh(),但form.show() 是在我们调用control.refresh 之后调用的。这不起作用。

修复很简单:

SplashScreen.Show(); // First call show
SplashScreen.Initialize(this, SplashScreenImage); // Now contorl.Refresh() works

【讨论】:

【参考方案7】:

我知道这个问题很老,但我也遇到了同样的问题。我尝试了 Refresh() 和许多其他的东西,但没有任何效果。如果我将文本放入 Messagebox.show 那么它在消息框中有效,但在表单中无效,所以我知道我有数据。当我有人在等待使用该应用程序时,我变得绝望,并且正要暂时取消该课程以使其正常工作时,我想到尝试 Invoke。所以我尝试了

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

        ));

目前它可以工作,但在我找到更好的解决方案之前,仍然不确定这是长期修复还是只是一个石膏。

【讨论】:

以上是关于C# 标签文本未更新的主要内容,如果未能解决你的问题,请参考以下文章

Kivy 标签文本未更新 - 仅在方法的最后一次更改时更新

C#关于winform线程更新form的文本框输出的问题

C# - 上次编辑的文本框未保存到数据库

输入类型文本字段值未返回确切文本

容器视图中的 UI 未更新

textfielddid开始编辑时未更新标签