我已经有一段时间没有做过任何视觉基础工作了。这个问题困扰了我一天的大部分时间。我记得过去 VB.net 容易得多...
我遇到的问题是我需要一个模块来更改/添加到 Form1 上的对象。为了解决这个发布的问题,我将通过使用模块内部的函数“添加”一个项目到位于 Form1 上的 ComboBox。
简单的代码示例:
表格1
Public Class Form1
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
'startup stuff
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
MyFuction1()
End Sub
End Class
模块1
Module Module1
Public Function MyFunction1()
Form1.ComboBox1.Items.Add("Test")
End Function
End Module
执行此操作时,我收到错误:
reference to non-shared member requires object reference.
我在模块 1 中尝试了以下操作,没有骰子。
Dim Frm1 As Form1
Frm1 = New Form1
Frm1.ComboBox1.Items.Add("Test")
尝试了其他一些东西,虽然我不记得/发布它们了,但已经很久了。
必须有一种方法使用模块来完成我需要的任务。请不要回复“不要使用模块”...
如果我在 Form1 中使用私有、共享或公共函数,也会遇到同样的错误。
我想发布尽可能简单的代码,而不需要为任何对象自定义名称。这样,如果问题得到解答并且有效,未来的人们在谷歌上花费数小时的时间将更容易将答案应用到他们自己的作品中。
感谢您的所有帮助, 唐尼
您正在寻找的是一个定制的界面,可以通过其他代码在您的表单中“执行操作”。
Public Class Form1
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
'startup stuff
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
MyFuction1()
End Sub
Public Sub AddItemToComboBox1(TheThing as String) ' This is what you need
ComboBox1.Items.Add(TheThing)
End Sub
End Class
然后在模块中
Module Module1
Public Sub TestAddThingToComboBox1()
Dim Frm1 As Form1
Frm1 = New Form1
Frm1.AddItemToComboBox1("Test")
End Sub
End Module
为什么? OOP 封装的要点是工作级别细节被……很好地……封装起来,并且用户可以使用定义良好的接口进行工作。表单控件是工作级别详细信息的一部分。此外,您可以在界面中添加输入验证和其他很酷的代码,或者更好地管理数据(例如重新排序 ComboBox)。
顺便说一句 - 当无意返回值时,使用
Sub
而不是 Function
。更安全的编码,您不会意外地将其分配给某些东西。
FORM1.VB
Partial Class Form1
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
'startup stuff
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
MyFunction1()
End Sub
End Class
模块1.VB
Partial Class Form1
Public Sub MyFunction1()
ComboBox1.Items.Add("Test")
End Sub
End Class
module1.vb 不再是一个模块,但是通过拆分文件,我仍然可以按照我想要使用模块的方式使用它。
Private Sub ComboBox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox.SelectedIndexChanged
Dim selectedCenter As String = ComboBox.SelectedItem.ToString()
If selectedCenter = "All" Then
allData = data
Else
allData = dara.Where(Function(data) data("name") = selectedCenter).ToList()
End If
结束子