Vb.net 从另一个窗体引用一个窗体上的控件
您可以猜到,我对.NET有点陌生,只想从一个窗体引用另一个窗体上的控件 通常我只会做Form.Control.Property,但这不起作用,我通过谷歌找到的每个例子对我都不起作用 它似乎过于复杂的公共类等 有没有更简单的方法?我准备认输了,现在就使用一个全局变量 我有一个表单,其中包含我想要引用的控件frmGenerate,它有一个名为txtCustomerNo的文本框Vb.net 从另一个窗体引用一个窗体上的控件,vb.net,winforms,Vb.net,Winforms,您可以猜到,我对.NET有点陌生,只想从一个窗体引用另一个窗体上的控件 通常我只会做Form.Control.Property,但这不起作用,我通过谷歌找到的每个例子对我都不起作用 它似乎过于复杂的公共类等 有没有更简单的方法?我准备认输了,现在就使用一个全局变量 我有一个表单,其中包含我想要引用的控件frmGenerate,它有一个名为txtCustomerNo的文本框 frmCustomers.ShowDialog() 从这个表单到一个按钮的点击事件,我想显示另一个表单,frmCustom
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。您是否介意将您的答案再扩展一点,让其他程序员理解它如何帮助解决问题。