从另一个表格引用一个表单上的控件

问题描述:

正如你所猜测的,我对.NET很陌生,只想引用另一个表单上的控件。从另一个表格引用一个表单上的控件

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

它只是似乎与公共类过于复杂等

有没有更简单的方法来做到这一点?我已经准备好了,现在就使用一个全局变量。

我有我想要引用的控件的形式,frmGenerate有一个名为txtCustomerNo的文本框。

从此表单通过按钮的单击事件我想显示另一个表单,frmCustomers,并使该表单参考txtCustomerNo中的值。

frmCustomers.ShowDialog() 

它必须是简单的东西,我只是没有抓住。

+1

你可以发布你的代码吗?一般来说,你的方法似乎是正确 – Oded 2010-12-17 14:41:17

与对照的形式要引用:

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()  

编辑: 我已经建立了一个样本项目为你在这里:

http://www.yourfilelink.com/get.php?fid=595015

+0

嘿,我已经完全添加了该代码,并获得“引用非共享成员需要对象引用”。 frmGenerate中的代码:Public ReadOnly Property CustomerNo()As String获取返回值Me.txtCustomerNo.Text End Get End Property。 frmCustomers中的代码以对话框打开:frmGenerate.CustomerNo返回该错误。它只是我还是这真的太复杂了达不到我需要的结局? – Tom 2010-12-17 15:01:04

+1

你正试图访问CLASS而不是该类的实例。这就是为什么你会得到“引用非共享成员”的错误。创建目标表单的一个实例,而不是尝试使用旧式的VB6方式来按名称“调用”表单。 Ie Dim frm = New MyForm,然后frm.whatever,而不仅仅是MyForm.Whatever的旧方式... – DarinH 2010-12-17 15:24:00

+0

这似乎很简单,但是当我声明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 
+1

欢迎来到*。您是否介意扩展您的答案,让其他程序员理解,以及它如何帮助解决问题。 – Daenarys 2016-03-03 06:31:29