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# 标签文本未更新的主要内容,如果未能解决你的问题,请参考以下文章