标签文本未显示正确的值,但消息框显示

本文关键字:显示 消息 文本 标签 | 更新日期: 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 ...

我在这里看到一个问题:


  1. drawThread = new Thread(draw);
    MessageBox.Show(player.score);
    使用这些行,第二个线程启动并立即显示 MessageBox(第二个线程可能尚未终止)


  2. label6.Text = player.score;当您关闭 MessageBox 时,将执行此行:如果第二个线程终止并且已经更新了分数,您将获得预期的结果;如果第二个线程仍在执行,则在标签中仍会找到以前的分数。

因此,在不知道您的第二个线程的作用的情况下,我无法知道您的代码是否正确。
在我看来,您应该在第二个线程终止时更新label6.Text(使用 Invoke);如果不是,为什么要使用第二个线程?
通常我们使用线程来执行长时间执行,而不会阻塞主线程(它负责更新表单和处理用户输入),因此您应该在需要时更新这些线程的属性。
考虑使用BackgroundWorker。