从另一个表格引用一个表单上的控件
正如你所猜测的,我对.NET很陌生,只想引用另一个表单上的控件。从另一个表格引用一个表单上的控件
通常我只是做Form.Control.Property,但这不起作用,我通过谷歌找到的每个例子都不适合我。
它只是似乎与公共类过于复杂等
有没有更简单的方法来做到这一点?我已经准备好了,现在就使用一个全局变量。
我有我想要引用的控件的形式,frmGenerate有一个名为txtCustomerNo的文本框。
从此表单通过按钮的单击事件我想显示另一个表单,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()
编辑: 我已经建立了一个样本项目为你在这里:
嘿,我已经完全添加了该代码,并获得“引用非共享成员需要对象引用”。 frmGenerate中的代码:Public ReadOnly Property CustomerNo()As String获取返回值Me.txtCustomerNo.Text End Get End Property。 frmCustomers中的代码以对话框打开:frmGenerate.CustomerNo返回该错误。它只是我还是这真的太复杂了达不到我需要的结局? – Tom 2010-12-17 15:01:04
你正试图访问CLASS而不是该类的实例。这就是为什么你会得到“引用非共享成员”的错误。创建目标表单的一个实例,而不是尝试使用旧式的VB6方式来按名称“调用”表单。 Ie Dim frm = New MyForm,然后frm.whatever,而不仅仅是MyForm.Whatever的旧方式... – DarinH 2010-12-17 15:24:00
这似乎很简单,但是当我声明Dim frm = New frmGenerate并引用txtCustomerNo时,我得到的只是一个空白串。 – Tom 2010-12-17 15:36:35
您需要确保您添加的属性是public
,否则他们将无法被其他类访问。
你应该能够使w ^憎恨你需要在公众的形式之外引用。在很多情况下,这就是所有需要的。
有时,创建单独的公共属性或方法很有用。并有方法照顾的细节。例如,如果你只是想能够访问文本,你可以创建一个像这样的属性(在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..);
也发送完整控制到另一种形式不是一个好策略。只通过公共属性/构造函数共享必要的字段。
尽管您可以在第二个窗体上创建一个属性,以返回所需的数据,但您可以轻松地更改该控件的修改器属性。默认情况下,控件的修饰符是私有的,因此对于当前表单以外的任何内容都无法访问。点击控件,找到Modifier属性。其设置为公开,你就可以从外面的形式访问它,比如:
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"
我救的人的名字在他们登录后登录到下一个表单上的文本框。 我的登录按钮具有的最后几行: Me.Hide()(不可Me.Close()) Admin.Show() 完
当用户输入一个正确的用户名和密码,它隐藏登录表单然后打开下一个页面,Admin.vb
在Admin.vb页面Admin_Load作为最后一个行我把:
昏暗的记录作为字符串 登录= Login.txtUser.Text Login.Close( )。 'Close hidden login.vb' End Sub
因此,用户按下登录按钮,并在txtUser文本框中用我想要的值隐藏登录表单。然后它打开管理页面。 Admin页面的加载事件,从txtUser文本框中的隐藏登录页面获取我的值,并将其放入参数“logged”中。 一旦该值被抓取,它将关闭登录页面并离开子文件。这一切都发生在眨眼之间! 现在我想在任何地方使用登录的人的名字,就像在文本框中,我只是使用“登录”。
txtchangesby.Text =登录
非常简单和有效。
My.Forms.frmGenerate.txtCustomerNo.Text
欢迎来到*。您是否介意扩展您的答案,让其他程序员理解,以及它如何帮助解决问题。 – Daenarys 2016-03-03 06:31:29
你可以发布你的代码吗?一般来说,你的方法似乎是正确 – Oded 2010-12-17 14:41:17