【问题标题】:C# Label Text Not UpdatingC# 标签文本未更新
【发布时间】: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 来验证。它只是不刷新屏幕。最后我也得到了“完成”。

有人有什么想法吗?

【问题讨论】:

    标签: c# winforms label sleep


    【解决方案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;
                
                        }));
                

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多