下面的代码:
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;
}
这是一个测试,我正在创建移植到我的应用程序。一切工作正常,但标签_消息.文本正在设置。它从来没有显示在屏幕上。它正在设置,我做了一个控制台。写在它验证。它只是没有刷新屏幕。我得到了“完成”在最后也。
有人有什么想法吗?
6条答案
按热度按时间dojqjjoe1#
你在UI线程上执行了一个很长的操作。你应该把它移到一个后台线程(比如通过
BackgroundWorker
),这样UI线程就可以在需要的时候做一些事情,比如重画屏幕。你可以欺骗并执行Application.DoEvents
,但是我真的建议你不要这样做。这个问题和答案基本上就是你要问的问题:
Form Not Responding when any other operation performed in C#
kxe2p93d2#
Label不会重新绘制,直到你把UI线程返回给消息循环。尝试
Label.Refresh
,或者更好的是,尝试把你的冗长操作放在一个后台线程中,就像其他发布者建议的那样。mefy6pfw3#
此操作在UI线程中执行。UI在完成之前不会更新。若要使其在发送过程中更新,必须在单独的线程中执行发送并从该线程更新标签
eit6fx6z4#
当你在运行用户界面元素的同一个线程中进行密集的计算/迭代时,通常会发生这种情况。要解决这个问题,你需要有一个单独的线程来完成这项工作,并相应地更新标签的值。我想发布一个完整的源代码示例,但我现在不在我的开发机器上。
js4nwp545#
为了补充这个问题,我遇到了一个闪屏表单的问题。我们的代码如下:
在
Initialize(this, SplashScreenImage);
中,我们更新了一些控件,然后在这些控件上运行刷新;不幸的是,这是行不通的。这里的问题是,虽然我们显式调用
control.Refresh()
,但form.show()
是在我们调用control.refresh
之后调用的。这是行不通的。解决方法很简单:
2g32fytz6#
我知道这个问题很老了,但我也遇到过同样的问题。我尝试了Refresh()和许多其他方法,但都没有效果。如果我将文本放入Messagebox.show,它会在消息框中工作,但不会在表单中工作,所以我知道我有数据。当我有人在等待使用这个应用程序时,我越来越绝望,正准备暂时取消这个类,让它工作时,我想到了所以我试着
目前,它的工作,但仍然不确定这是一个长期的修复或只是一个石膏,直到我找到一个更好的解决方案。