无法更新Windows窗体中的状态栏文本

时间:2018-07-10 06:32:16

标签: c# winforms statusbar

在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之类的各种帖子,并开始编写上述代码,但似乎不起作用。谁能告诉我我要去哪里错了或者我该怎么办才能解决这个问题?

2 个答案:

答案 0 :(得分: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;
    }
}

如果要创建和更新多个状态栏,则必须对其进行跟踪。

答案 1 :(得分:1)

每次更新文本时都不要创建新的statusBar

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");
    }
}