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

如何修复「引用非共享成员需要对象引用」的VB.NET报错

报错原因与解决方案

核心报错原因

  • 你定义的GetListaProdutos是Shared(共享)方法,这类方法归类本身所有,不属于类的实例,无法直接访问任何非共享成员,更不能跨类直接读取其他窗体内的非共享控件属性。
  • TextBox1、TextBox2这类控件是你所在窗体的实例成员,默认访问权限为私有,在独立的Produtos类中直接调用时,编译器无法找到对应控件的实例引用,因此抛出非共享成员需要对象引用的错误。

修复方案

方案1:修改共享方法,将控件值作为参数传入

不要在Produtos类的方法内直接读取控件,改为调用时从窗体传递参数:
首先修改Produtos类的GetListaProdutos方法:

Public Class Produtos
    Public Property demonstracao As String
    Public Property none As String
    Public Property percentagem As String
    Public Property valor As Decimal

    Public Sub New(demonstracao As String, none As String, percentagem As String, valor As Decimal)
        Me.demonstracao = demonstracao
        Me.none = none
        Me.percentagem = percentagem
        Me.valor = valor
    End Sub

    ' 增加参数接收窗体传入的控件值
    Public Shared Function GetListaProdutos(demo As String, none As String, pct As String, valor As Decimal) As List(Of Produtos)
        Dim relProdutos As New List(Of Produtos)
        relProdutos.Add(New Produtos(demo, none, pct, valor))
        Return relProdutos
    End Function
End Class

然后在窗体代码中调用该方法时,传入对应控件的值:

' 示例:在窗体的按钮点击事件中调用
Dim listaProdutos = Produtos.GetListaProdutos(TextBox1.Text, TextBox2.Text, TextBox3.Text, Decimal.Parse(TextBox4.Text))
' 后续接你原有添加单元格的循环逻辑即可

方案2:将生成列表的逻辑移到窗体代码中

读取控件生成列表属于窗体交互逻辑,不属于Produtos实体类的职责,直接把逻辑搬到窗体代码中更合理:

' 写在你的窗体代码中,比如触发生成列表的事件里
Dim relProdutos As New List(Of Produtos)
relProdutos.Add(New Produtos(TextBox1.Text, TextBox2.Text, TextBox3.Text, Decimal.Parse(TextBox4.Text)))
' 后续直接使用relProdutos执行添加单元格的循环即可

注意事项

TextBox4的输入是字符串类型,需要转换为Decimal才能匹配类的属性类型,建议提前对输入内容做合法性校验,避免输入非数字内容时抛出格式转换错误。


内容的提问来源于stack exchange,提问作者Daniel André

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:48:03