我以前见过类似的问题,但似乎没有一个适合我的情况。 我有一个Windows窗体,窗体有一个后台工作者,工作者支持更新。 我有一个状态条标签。
单击按钮启动后台工作程序,单击该按钮后,后台工作程序启动正常。每次迭代我都会进行更新,将字符串作为用户状态发送。 如果我使用该字符串来更新表单的标题,标题会随着进程的运行而更改,并按预期工作...但是,如果我尝试使用该字符串来更新状态条标签的值,那么标签没有得到更新。
我正在一个单独的线程上进行工作,然后是UI线程,而且我无论如何都没有阻止UI线程,这可以通过按预期观看标题更新来证明。但是状态条标签未更新。
显然,状态条标签不是System.Windows.Controls的子类,但是我试图使状态条标签无效,我试图使状态条标签所在的状态条无效并刷新,但是在背景工作正常时,我无法获取状态条标签来更改文本。
以下是Progress Changed事件的代码
void workerThread_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//_statusCurrentActivityLBL.Text = e.UserState.ToString();
String s = e.UserState.ToString();
Text = s;
_statusCurrentActivityLBL.Text = s;
_statusCurrentActivityLBL.Invalidate();
statusStrip1.Invalidate();
statusStrip1.Refresh();
}
正如我所说,Windows表单文本更改正确,但状态标签没有。
UPDATE @Richard Schneider Label的Class名称是ToolStripStatusLabel它似乎没有Refresh()成员。
更新2 @Chibueze Opata 代码运行没有错误。标题文本将更改,如果我更新简单标签上的文本控件标签更新(这是我目前的工作)。问题是状态条上的ToolStripStatusLabel没有更新。
答案 0 :(得分:-3)
尝试使用Application.DoEvents() 在更新标签之前
试试这种方式
Delegate Sub SetLabelText(ByVal [Label] As Label, ByVal [text] As String)
Private Sub SetStatus(ByVal [Label] As Label, ByVal [text] As String)
' InvokeRequired required compares the thread ID of the calling thread to the thread ID of the creating thread.
' If these threads are different, it returns true.
If [Label].InvokeRequired Then
Dim MyDelegate As New SetLabelText(AddressOf SetStatus)
Me.Invoke(MyDelegate, New Object() {[Label], [text]})
Else
[Label].Text = [text]
End If
End Sub
像这样调用这个函数
SetStatus(lblStatus,"Status message")