我是Visual Studio 2013的新手,所以我的问题可能是 - 并且希望 - 一个简单的问题。
我目前正在编写一个小程序(在VB中),它实际上将从表中添加/更新/删除用户。
主窗体有三个TextBox(ID#,名称,姓氏),一个用于检查用户是否已存在的按钮以及另外几个按钮(保存和取消)
我还创建了一个Class(dataLookup),其中存储了添加,更新或删除用户的所有功能。
该计划的运作方式如下:
1.-用户在主要表格的ID字段中输入ID#,然后点击"检查用户"按钮。
2.-系统调用存储在datalookup类中的函数,该函数验证ID#是否已存在。
3.-如果是,则该函数从表中检索名称和姓氏,将它们分配给两个局部变量(vName和vLastName)填充主窗体上的相应字段并返回TRUE。然后,用户可以更新数据或取消(参见下面的代码示例)
MainFormName.TextBox1.Text = vName
MainFormName.TextBox2.Text = vLastName
return True
4.-如果ID#不存在,则该函数返回FALSE。然后,用户可以在三个文本框中输入新数据。
我的问题是我无法从dataLookup类中存储的函数填充TextBox字段。处理完指令后,TextBox(它们都已启用且其Read Only属性设置为false)保持为空。
如果我将填充字段的完全相同的代码添加到主窗体代码中,并为vName和vLastName变量赋值,则它可以完美地运行:
vName = "John"
vLastName = "Doe"
MainFormName.TextBox1.Text = vName
MainFormName.TextBox2.Text = vLastName
仅供参考,编译/运行程序时不会报告错误。
我知道我可以修改这个函数,所以它也会返回名字和姓氏,然后我就能从主表单中更新TextBox字段了,但我只是好奇:为什么不能这样做?我是从存储在类中的函数那样做的吗?
希望我的描述相当清楚:)任何帮助将不胜感激。非常感谢提前!
兰迪
答案 0 :(得分:2)
表单是类(它在每个表的顶部都是这样说的):
Public Class MainForm
....
作为一个类,应该创建一个实例,但VB允许使用类名称的默认实例:MainForm.Show()
在幕后,编译器创建一个名为MainForm
的{{1}}实例并使用它。这对于涉及代码的开发人员爱好者来说很方便,但是有很多方法可以让你感到厌烦:
MainForm
这里创建并使用Sub DoSomeThing()
Dim frm As New Form1
frm.TextBox1.Text = cp.ToString
End Sub
的本地实例,它与VB创建的Form1
无关。本地对象在Sub的末尾超出范围,永远不会被应用程序的其余部分使用。
Global Form1
尽管使用相同的名称,但这些实际上是不同的实例。文本不会显示,如果下一行是' in sub main:
Application.Run(New Form1) ' main form/pump
... elsewhere
Form1.TextBox1.Text = "hello, world!"
,则Form1.Show()
的第二个副本将显示完整的“hello,world”文本。这些也将创建/显示新实例:
Form1
通常,应用程序越复杂,使用默认实例就越不合适。对于严肃的应用程序,请创建显式表单实例:
Form2.Show()
' or
Dim frm As New Form2
frm.Show()
可以通过各种方式告诉类或其他形式,例如通过属性或构造函数:
Dim myFrm = New Form7() ' myFrm is an instance of Form7
...
myFrm.TextBox1.Text = vName
myFrm.TextBox2.Text = vLastName
myFrm.Show
对于主/启动表单,它可以帮助创建全局引用:
Class Foo
Private myFrm As Form7
Public Sub New(frm As Form7)
myFrm = frm
End Sub
...
End Class
Dim myFoo = New Foo(Me)
然后在主窗体加载时设置变量:
Module Program
Friend frmMain As MainForm
End Module
Public Class MainForm
Private Sub MainForm_Load(sender ...)
frmMain = Me
End Sub
...
将是对整个应用程序的主窗体的有效引用。