【问题标题】:cannot update status bar text in windows form无法更新 Windows 窗体中的状态栏文本
【发布时间】:2018-07-10 06:32:16
【问题描述】:

在我的 Windows 窗体应用程序中,我试图更新状态栏上的文本,但无法这样做。 这是我的代码:

public void CreateMyStatusBar(string msg = "Ready")
 {
            StatusBar statusBar1 = new StatusBar();

            this.Invoke(new Action(() =>
            {
                statusBar1.Text = msg;
                statusBar1.Update();
            }));


            statusBar1.Invalidate();

            statusBar1.Refresh();

            statusBar1.Update();

            Form1.gui.Controls.Add(statusBar1);

}

Form1 是我的主要表单,gui 在 Form1.cs 中定义为public static Form1 gui;

每当我打电话时

CreateMyStatusBar("ABC")

函数它显示第一次调用时发送给它的文本。但是当再次调用此函数时,文本不会更新。

我浏览了thisthis 等各种帖子,并开始编写上述代码,但它似乎不起作用。谁能告诉我哪里出了问题或者我必须做些什么来解决这个问题?

【问题讨论】:

  • 你认为Form1.gui.Controls.Add(statusBar1); 更新状态栏了吗?还是添加一个新的状态栏?

标签: c# winforms statusbar


【解决方案1】:

我认为您不需要所有调用/更新功能。我已经创建了一个带有面板的表单。

private void CreateMyStatusBar(string msg = "Ready")
{
   panel1.Controls.Add(new StatusBar{ Text = msg });
}

private void button1_Click(object sender, EventArgs e)
{
   CreateMyStatusBar("Test");
   CreateMyStatusBar();
}

如果您不想每次都创建一个新的状态栏,而是更新现有的状态栏,您可以使用此方法。假设面板应该只有一个 StatusBar 实例。

private void CreateOrUpdate(string msg = "Ready")
{
    var statusBar = panel1.Controls.OfType<StatusBar>().FirstOrDefault();
    if (statusBar == null)
    {
        panel1.Controls.Add(new StatusBar { Text = msg });
    }
    else
    {
        statusBar.Text = msg;
    }
}

如果您想创建和更新多个状态栏,您必须跟踪它们。

【讨论】:

  • 我用你的代码替换了我的代码。然后我试着把它叫做 Form1.gui.CreateMyStatusBar("One"); Form1.gui.CreateMyStatusBar("Two");它总是显示“一个”没有更新
  • CreateMyStatusBar 创建一个新项目。如果你想更新你需要访问现有的文本。
【解决方案2】:

不要在每次更新文本时都创建新的状态栏

StatusBar statusBar1 = null;
public void CreateMyStatusBar(string msg = "Ready")
{
     if(statusBar1 == null) {
        statusBar1 = new StatusBar();
        Form1.gui.Controls.Add(statusBar1);
     }
     this.Invoke(new Action(() =>
     {
            statusBar1.Text = msg;
            statusBar1.Update();
     }));


     statusBar1.Invalidate();

     statusBar1.Refresh();
     statusBar1.Update();

}

编辑: 改用 this.Controls.Add 有帮助吗?

public partial class Form1 : Form
{

    StatusBar statusBar1 = null;
    public Form1()
    {
        InitializeComponent();
        this.Shown += new System.EventHandler(this.Form1_Shown);
    }





    public void CreateMyStatusBar(string msg = "Ready")
    {
        if (statusBar1 == null)
        {
            statusBar1 = new StatusBar();
            this.Controls.Add(statusBar1);
        }
        if (InvokeRequired)
        {
            this.Invoke(new Action(() =>
            {
                statusBar1.Text = msg;
                statusBar1.Update();
            }));
        }
        else
        {
            statusBar1.Text = msg;
        }


        statusBar1.Invalidate();

        statusBar1.Refresh();
        statusBar1.Update();

    }

    private void Form1_Shown(object sender, EventArgs e)
    {
        CreateMyStatusBar("one");
        System.Threading.Thread.Sleep(5000);//Wait - and blocks UI :(
        CreateMyStatusBar("two");
    }
}

【讨论】:

  • 我用你的代码替换了我的代码。然后我试着把它叫做 Form1.gui.CreateMyStatusBar("One"); Form1.gui.CreateMyStatusBar("Two");它总是显示“一个”没有更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-23
  • 1970-01-01
  • 2014-04-09
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多