如何修复「引用非共享成员需要对象引用」的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é
相关产品推荐
相关产品推荐

