在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”)
功能显示第一次呼叫时发送给它的文本。但是当再次调用此函数时,文本不会更新。
我经历了诸如this和this之类的各种帖子,并开始编写上述代码,但似乎不起作用。谁能告诉我我要去哪里错了或者我该怎么办才能解决这个问题?
答案 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");
}
}