Vb.net 从另一个窗体引用一个窗体上的控件

Vb.net 从另一个窗体引用一个窗体上的控件,vb.net,winforms,Vb.net,Winforms,您可以猜到,我对.NET有点陌生,只想从一个窗体引用另一个窗体上的控件 通常我只会做Form.Control.Property,但这不起作用,我通过谷歌找到的每个例子对我都不起作用 它似乎过于复杂的公共类等 有没有更简单的方法?我准备认输了,现在就使用一个全局变量 我有一个表单,其中包含我想要引用的控件frmGenerate,它有一个名为txtCustomerNo的文本框 frmCustomers.ShowDialog() 从这个表单到一个按钮的点击事件,我想显示另一个表单,frmCustom

您可以猜到,我对.NET有点陌生,只想从一个窗体引用另一个窗体上的控件

通常我只会做Form.Control.Property,但这不起作用,我通过谷歌找到的每个例子对我都不起作用

它似乎过于复杂的公共类等

有没有更简单的方法?我准备认输了,现在就使用一个全局变量

我有一个表单,其中包含我想要引用的控件frmGenerate,它有一个名为txtCustomerNo的文本框

frmCustomers.ShowDialog()
从这个表单到一个按钮的点击事件,我想显示另一个表单,frmCustomers,并让该表单引用txtCustomerNo中的值

frmCustomers.ShowDialog()

它必须是我没有掌握的简单内容。

您需要确保您添加的属性是公共的,否则其他类将无法访问这些属性。

在包含要引用的控件的表单中:

Public Property CustomerNo() As TextBox
    Get
        Return txtCustomerNo
    End Get
    Set(ByVal Value As TextBox)
        txtCustomerNo = Value
    End Set
End Property
以您希望引用控件的形式:

Dim CustomerNo as string = _sourceForm.CustomerNo.Text
这样做是一个糟糕的设计,但这是最简单的方法,应该让你走上正轨

如果您只对文本框中输入的值感兴趣,则以下内容可能更好:

Public ReadOnly Property CustomerNo() As String
    Get
        Return txtCustomerNo.Text
    End Get
End Property
以上要求第二个表单引用第一个表单的实际实例。将以下内容添加到第二个表单中:

Private _sourceForm as frmGenerate

Public Property SourceForm() As frmGenerate 
    Get
        Return _sourceForm
    End Get
    Set(ByVal Value As frmGenerate)
        _sourceForm = Value
    End Set
End Property
Dim customersForm as new frmCustomers
customersForm.SourceForm = Me
customersForm.Show()    
现在,您可以执行以下操作来处理第二个表单的创建和启动:

Private _sourceForm as frmGenerate

Public Property SourceForm() As frmGenerate 
    Get
        Return _sourceForm
    End Get
    Set(ByVal Value As frmGenerate)
        _sourceForm = Value
    End Set
End Property
Dim customersForm as new frmCustomers
customersForm.SourceForm = Me
customersForm.Show()    
编辑: 我在这里为您构建了一个示例项目:


你应该能够将你需要在表单之外引用的任何内容公开。在许多情况下,这就是所需要的

有时,创建单独的公共属性或方法很有用。并让方法处理细节。例如,如果您只是希望能够访问文本,那么可以在C中创建类似这样的属性

public string CustomerNo
{
    get
    {
        return txtCustomerNo.Text;
    }
    set
    {
        txtCustomerNo.Text = value;
    }
}

建立一个私人领域。右键单击“重构”,选择“封装字段”。这将自动为字段创建公共属性

另一种方法是重载公共构造函数

public CustomersForm(string property1, string property2...)
{
     //Get the properties and do what is necessary.
}

//Parent Form

CustomersForm frmCustomers = new CustomersForm(property1, property2..);

同时,将完整控件发送到另一个表单也不是一个好策略。仅通过公共属性/构造函数共享必需的字段。

虽然您可以在第二个窗体上创建一个属性以返回所需的数据,但您也可以轻松地更改该控件的修饰符属性。默认情况下,控件的修饰符是私有的,因此除了当前窗体之外,其他任何对象都无法访问。单击该控件,并找到修改器属性。将其设置为Public,您就可以从表单外部访问它,例如:

Dim f As New SecondForm
f.FirstNameTextBox.Text = "Bob"

更好的方法是传递引用 将控件的任何属性更改到类中 使用您的逻辑,然后将其发送回调用表单

这里的技巧是确保类代码使用 被调用类中的ByRef参数,否则这将不起作用。 在内存中,您正在引用同一控件,而不创建新控件 属性,这样可以减少代码爬行

例如,下面是如何从类代码中禁用按钮

在表单中,调用类并将按钮或任何其他控件传递给它:

' new the class your calling
Dim CallClass As New ProgramCall
' pass the control as a by reference argument
CallClass .SetUpTheCall("HOURLY", btnSendToBank)  
然后,在你的课堂上:

Public Sub SetUpTheCall(ByVal ParmToPass As String, ByRef btnSendToBank As Button)

' your class logic goes here...

' disable the send button on the calling form
btnSendToBank.Enabled = False

' change the button text on the calling form
btnSendToBank.text = "Disabled"

在他们像这样登录后,我将登录者的姓名保存到下一个表单的文本框中。 “我的登录”按钮有最后几行: 我,别躲我,关上 行政秀 结束

当用户输入正确的用户名和密码时,它会隐藏登录表单并打开下一页Admin.vb

在Admin.vb页面的Admin_加载中,作为我放置的最后一行:

作为字符串记录 logged=Login.txtUser.Text 登录。关闭。“关闭隐藏的login.vb' 端接头

因此,用户按下login按钮,它在txtUser文本框中用我想要的值隐藏登录表单。然后打开管理页面。Admin页面的load事件,从txtUser文本框中的隐藏登录页面获取my值,并将其放入logged参数中。 一旦抓取该值,它将关闭登录页面并离开sub。这一切都发生在眨眼之间! 现在,我想在任何地方使用登录者的姓名,就像在一个文本框中,我只使用logged

txtchangesby.Text=已记录


非常简单且有效。

您能发布您的代码吗?您的方法总体上看起来是正确的。嘿,我已经添加了代码,并且获取对非共享成员的引用需要对象引用。frmGenerate:Public ReadOnly属性CustomerNo As String Get Return Me.txtCustomerNo.Text End Get End属性中的代码。作为对话框打开的frmCustomers中的代码:frmGenerate.CustomerNo返回该错误。仅仅是我,还是这真的过于复杂,无法达到我所需要的目的?您正在尝试访问该类,而不是该类的实例。这就是为什么您得到对非共享成员错误的引用。创建目标的实例
My.Forms.frmGenerate.txtCustomerNo.Text

窗体,而不是尝试使用老式的VB6方式,即仅按名称调用窗体。Ie Dim frm=New MyForm,然后是frm.whatever,而不是只使用MyForm的旧方法。whatever…这似乎很简单,但当我声明Dim frm=New frmGenerate并引用txtCustomerNo时,我得到的只是一个空字符串。您正在创建一个新实例。相反,您需要将表单的实际实例发送到第二个表单。欢迎使用Stackoverflow。您是否介意将您的答案再扩展一点,让其他程序员理解它如何帮助解决问题。