表单控件未从类方法更新

时间:2015-01-31 13:52:07

标签: vb.net

我是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字段了,但我只是好奇:为什么不能这样做?我是从存储在类中的函数那样做的吗?

希望我的描述相当清楚:)任何帮助将不胜感激。非常感谢提前!

兰迪

1 个答案:

答案 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 ... 将是对整个应用程序的主窗体的有效引用。