You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET中如何从函数类更新Form1的Label文本

问题解决:WinForms中从工具类更新UI控件引发的NullReferenceException

错误原因分析

  • 错误创建Form实例:RegularExpressions类中Public Shared Property Frm As New Form1是新建了一个全新的Form1对象,并非当前运行的用户交互实例。这个新实例的所有控件都未初始化,自然为null。
  • 未赋值的Shared控件属性:txtTitle作为Shared属性从未被赋值,始终指向null,访问其Text属性必然触发空引用异常。

解决方案(两种可选)

方案1:直接传递目标Label控件到工具方法(简单直接)

工具类无需依赖Form类型,仅操作传入的Label控件,解耦性较好。

修改RegularExpressions.vb代码:

Imports System.Text.RegularExpressions
Imports Leaf.xNet

Public Class RegularExpressions
    ' 移除多余的Shared Form和Label属性
    Public Shared Sub getValues_Offline_Title(ByVal targetLabel As Label)
        Using req As New HttpRequest()
            Dim Offline_Title As String
            Dim url As String
            Dim _videoID As String = Functions.VideoURL_link.ToString

            req.AddHeader("Host", "www.youtube.com")
            req.AddHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36")
            req.AddHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
            req.AddHeader("Accept-Language", "en-US,en;q=0.9,cs;q=0.8,de;q=0.7,fr;q=0.6,hu;q=0.5")
            req.AddHeader("Accept-Encoding", "gzip, deflate")
            req.AddHeader("Referrer", $"https://www.youtube.com/watch?v={_videoID}")

            Dim strData As String = req.[Get](String.Concat("https://www.youtube.com/watch?v=", _videoID), Nothing).ToString()
            url = strData.ToString().Split({"twoColumnWatchNextResults"";:"}, StringSplitOptions.None)(1).Split("]"c)(0)
            Offline_Title = url.Split(New String() {"text"";:"""}, StringSplitOptions.None)(1).Split(""""c)(0)

            ' 检查控件是否需要Invoke,再更新文本
            If targetLabel.InvokeRequired Then
                targetLabel.Invoke(Sub() targetLabel.Text = Offline_Title)
            Else
                targetLabel.Text = Offline_Title
            End If
        End Using
    End Sub
End Class

修改Form1中的调用代码:

Private Sub RadioButton1_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton1.CheckedChanged
    If RadioButton1.Checked Then
        ' 传入你要更新的Label控件实例(示例名为lbl_Title)
        RegularExpressions.getValues_Offline_Title(Me.lbl_Title)
    Else
        RegularExpressions.getValues_Live_Title(Me.lbl_Title)
    End If
End Sub

方案2:使用事件解耦(符合面向设计原则)

工具类仅负责获取数据,通过事件通知UI层更新,完全不依赖UI控件类型,扩展性更好。

修改RegularExpressions.vb代码:

Imports System.Text.RegularExpressions
Imports Leaf.xNet

Public Class RegularExpressions
    ' 定义事件,用于传递获取到的标题
    Public Shared Event TitleRetrieved(title As String)

    Public Shared Sub getValues_Offline_Title()
        Using req As New HttpRequest()
            Dim Offline_Title As String
            Dim url As String
            Dim _videoID As String = Functions.VideoURL_link.ToString

            req.AddHeader("Host", "www.youtube.com")
            req.AddHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36")
            req.AddHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
            req.AddHeader("Accept-Language", "en-US,en;q=0.9,cs;q=0.8,de;q=0.7,fr;q=0.6,hu;q=0.5")
            req.AddHeader("Accept-Encoding", "gzip, deflate")
            req.AddHeader("Referrer", $"https://www.youtube.com/watch?v={_videoID}")

            Dim strData As String = req.[Get](String.Concat("https://www.youtube.com/watch?v=", _videoID), Nothing).ToString()
            url = strData.ToString().Split({"twoColumnWatchNextResults"";:"}, StringSplitOptions.None)(1).Split("]"c)(0)
            Offline_Title = url.Split(New String() {"text"";:"""}, StringSplitOptions.None)(1).Split(""""c)(0)

            ' 触发事件传递标题
            RaiseEvent TitleRetrieved(Offline_Title)
        End Using
    End Sub
End Class

修改Form1代码:

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' 订阅事件
        AddHandler RegularExpressions.TitleRetrieved, AddressOf UpdateTitleLabel
    End Sub

    Private Sub RadioButton1_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton1.CheckedChanged
        If RadioButton1.Checked Then
            RegularExpressions.getValues_Offline_Title()
        Else
            RegularExpressions.getValues_Live_Title()
        End If
    End Sub

    ' 事件处理方法,更新Label
    Private Sub UpdateTitleLabel(title As String)
        If Me.lbl_Title.InvokeRequired Then
            Me.lbl_Title.Invoke(Sub() Me.lbl_Title.Text = title)
        Else
            Me.lbl_Title.Text = title
        End If
    End Sub
End Class

额外优化建议

当前网络请求为同步执行,会阻塞UI线程导致界面假死,建议放到后台线程执行:

' 在Form1的调用处修改为异步执行
If RadioButton1.Checked Then
    Task.Run(Sub() RegularExpressions.getValues_Offline_Title())
Else
    Task.Run(Sub() RegularExpressions.getValues_Live_Title())
End If

内容的提问来源于stack exchange,提问作者MiningChamber

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 13:10:26