winforms C#标签文字未更新

bxpogfeg  于 2022-11-25  发布在  C#
关注(0)|答案(6)|浏览(257)

下面的代码:

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;
}

这是一个测试,我正在创建移植到我的应用程序。一切工作正常,但标签_消息.文本正在设置。它从来没有显示在屏幕上。它正在设置,我做了一个控制台。写在它验证。它只是没有刷新屏幕。我得到了“完成”在最后也。
有人有什么想法吗?

dojqjjoe

dojqjjoe1#

你在UI线程上执行了一个很长的操作。你应该把它移到一个后台线程(比如通过BackgroundWorker),这样UI线程就可以在需要的时候做一些事情,比如重画屏幕。你可以欺骗并执行Application.DoEvents,但是我真的建议你不要这样做。
这个问题和答案基本上就是你要问的问题:
Form Not Responding when any other operation performed in C#

kxe2p93d

kxe2p93d2#

Label不会重新绘制,直到你把UI线程返回给消息循环。尝试Label.Refresh,或者更好的是,尝试把你的冗长操作放在一个后台线程中,就像其他发布者建议的那样。

mefy6pfw

mefy6pfw3#

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

eit6fx6z

eit6fx6z4#

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

js4nwp54

js4nwp545#

为了补充这个问题,我遇到了一个闪屏表单的问题。我们的代码如下:

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
2g32fytz

2g32fytz6#

我知道这个问题很老了,但我也遇到过同样的问题。我尝试了Refresh()和许多其他方法,但都没有效果。如果我将文本放入Messagebox.show,它会在消息框中工作,但不会在表单中工作,所以我知道我有数据。当我有人在等待使用这个应用程序时,我越来越绝望,正准备暂时取消这个类,让它工作时,我想到了所以我试着

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

        }));

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

相关问题