【问题标题】:how to do rename the label name from 1 to 75 at run time in vb.net?如何在运行时在 vb.net 中将标签名称从 1 重命名为 75?
【发布时间】:2015-02-22 11:05:46
【问题描述】:
Public Sub Rename(ByVal labelno As Integer)
    Try
        Dim lbl As New Label
        lbl = Controls("Label" & labelno.ToString())
        lbl.Text = ReceivedFrame.ToString()
    Catch ex As Exception
        MessageBox.Show(ex.Message.ToString())
    End Try

我想将标签文本从 1 更改为 50。标签没有作为输入给出。我试过上面的代码。它在其他项目中工作。但在我当前的项目中它不起作用错误显示如下(跨线程操作无效。控制标签1从线程访问。不是它创建的线程),我只想更改标签文本。标签和标签不是工作正常,我验证了。有没有其他方法可以在 vb.net 中重命名标签?

【问题讨论】:

标签: vb.net


【解决方案1】:

您正在尝试修改控件的属性,该属性驻留在与您调用Rename() 的线程不同的线程上。更新控件时,您应该检查是否需要将调用发送到适当的线程,或“调用”调用。这应该可以。

方法 1:始终调用

Public Sub Rename(ByVal labelno As Integer)
    Try
        Dim lbl As New Label
        lbl = Controls("Label" & labelno.ToString())
        lbl.Invoke(Sub() lbl.Text = ReceivedFrame.ToString())
    Catch ex As Exception
        MessageBox.Show(ex.Message.ToString())
    End Try
End Sub

它将总是调用调用,当从控件的线程调用Rename() 时,这是不必要的开销。但它应该始终有效。您也可以这样做,只在需要时调用,以免对 UI 线程进行不必要的调用。

方法 2:仅在需要时调用

Public Sub Rename(ByVal labelno As Integer)
    Try
        Dim lbl As New Label
        lbl = Controls("Label" & labelno.ToString())
        changeLabelText(lbl, ReceivedFrame.ToString())
    Catch ex As Exception
        MessageBox.Show(ex.Message.ToString())
    End Try
End Sub

Private Delegate Sub changeLabelDel(lbl As Label, txt As String)

Private Sub changeLabelText(lbl As Label, txt As String)
    If lbl.InvokeRequired Then
        lbl.Invoke(New changeLabelDel(AddressOf ChangeLabelText), lbl, txt)
    Else
        lbl.Text = txt
    End If
End Sub

哦,还有一件事。您可以自动化整个调用所需的检查以供将来使用。将扩展方法放在一个模块中

方法 3:自动调用所需的模式,可重用代码

<Extension() _
Public Sub InvokeIfRequired(ByVal c As Control, mi As MethodInvoker)
    If c.InvokeRequired Then
        c.Invoke(mi)
    Else
        mi()
    End If
End Sub

然后这样称呼它:

Public Sub Rename(ByVal labelno As Integer)
    Try
        Dim lbl As New Label
        lbl = Controls("Label" & labelno.ToString())
        lbl.InvokeIfRequired(Sub() lbl.Text = ReceivedFrame.ToString())
    Catch ex As Exception
        MessageBox.Show(ex.Message.ToString())
    End Try
End Sub

本网站上有大量关于此主题的信息。见

What does 'InvokeRequired' and 'Invoke' mean in .Net?

VB.net, Invoke, delegates, and threading. Can't figure out how to use them across classes

【讨论】:

    猜你喜欢
    • 2018-08-22
    • 2021-12-12
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 2020-09-06
    • 2019-12-26
    相关资源
    最近更新 更多