标签文本未显示正确的值,但消息框显示
本文关键字:显示 消息 文本 标签 | 更新日期: 2023-09-27 18:31:13
我在C#.NET中有一个简单的标签,似乎没有"更新"。它仅显示我的应用程序的第一个初始值。在下面的代码中,"score"变量不会更新,但是在调用 messagebox.show 对话框时,它会显示正确的值。分数值在不同的线程中发生了变化,但我不认为这是调用和跨线程形式控制的问题(因为我在创建 label6 的线程中调用此代码)。
有谁知道可能的解决方案是什么?我尝试了Application.DoEvents()方法,但无济于事。此外,两者都没有标签6。更新() 也不是标签6。Refresh() 在标签 6 之后放置时似乎有效。文本 = 分数线。
玩家是我创建的一个类,将分数值作为公共 int。
public Form1()
{
InitializeComponent();
createGame();
}
public void createGame()
{
InitializeComponent();
drawThread = new Thread(draw);
MessageBox.Show(player.score);
label6.Text = player.score;
}
public void draw()
{
//do drawing, change player.score value
//end thread
}
public void button_click()
{
if(firstrun)
drawThread.Start()
else{
createGame()
drawThread.Start()
}
}
编辑(来自评论):这是一个WinForms应用程序。标签6.Text = score line 是调用 label6 的唯一实例,而不是在 Visual Studio 生成的 Form.Designer 代码中实例化。
只需在标签上执行Refresh()
操作即可。
label6.Refresh();
在你的代码中,我看到
drawThread = new Thread(draw);
但是在单击按钮时,您调用draw.Start()
所以我认为您的渲染线程根本没有启动!你不应该使用drawThread.Start()
吗?
更多:您无法从与 main 不同的线程访问图形控件属性,您应该使用 Invoke
...
我在这里看到一个问题:
drawThread = new Thread(draw);
使用这些行,第二个线程启动并立即显示 MessageBox(第二个线程可能尚未终止)
MessageBox.Show(player.score);label6.Text = player.score;
当您关闭 MessageBox 时,将执行此行:如果第二个线程终止并且已经更新了分数,您将获得预期的结果;如果第二个线程仍在执行,则在标签中仍会找到以前的分数。
因此,在不知道您的第二个线程的作用的情况下,我无法知道您的代码是否正确。
在我看来,您应该在第二个线程终止时更新label6.Text
(使用 Invoke
);如果不是,为什么要使用第二个线程?
通常我们使用线程来执行长时间执行,而不会阻塞主线程(它负责更新表单和处理用户输入),因此您应该在需要时更新这些线程的属性。
考虑使用BackgroundWorker。