【问题标题】:vb.net Pass Textbox Between forms.vb.net 在表单之间传递文本框。
【发布时间】:2016-02-19 07:17:50
【问题描述】:

我有 2 个表格。在 Form1 上,我想在加载时将文本框值传递给表单 2。这是我认为可行的。 Form1 将被加载并运行,数据将填充到 form1 中。我在 form1 中公开文本框的属性。然后我试图在 form2 中使用该暴露的属性。

Public Class form1

Public ReadOnly Property GetTextBox() As String
    Get
        Return txtbox1.Value
    End Get
End Property

在表单 2 上

 Dim X As form1
 Me.TextBox1.Text = X.GetTextBox

【问题讨论】:

  • X 不会引用现有的、打开的 form1 实例
  • 文本框的值为'Text',即TextBox1.Text =
  • 好吧,为了确定我在 form1 上做了一个 messagebox.show(GetSportsTextBox),它显示了我期望的正确值。

标签: .net vb.net


【解决方案1】:

VB 将允许您refer to instances of forms by their class name,因此您可以使用:

Me.TextBox1.Text = Form1.GetTextBox

但是,您不应该依赖这个,而应该将 Form1 的显式实例传递给 Form2,例如在构造函数中:

' Form2
Public Sub New(ByVal f As Form1)
    Me.New()

    ' save 'f' for future reference
End Sub

【讨论】:

  • 默认表单实例是导致许多难以发现的错误的原因。您不仅不应该依赖它们,还应该完全避免使用它们,恕我直言。
  • 这是form1的最终代码 Dim pTextBox As String pTextBox = txtbox1.Value Dim frm As New frm2(pTextBox) frm.Show()
【解决方案2】:

有几种方法可以给这只猫剥皮。

最简单的方法是为Form2 创建第二个(或替换现有的)构造函数,它接受string 作为参数。然后当Form1 创建Form2 时,您可以通过这种方式传递参数。

Public Class Form2
    Sub New(ByVal txt As String)
        InitializeComponent()
        Me.TextBox1.Text = txt
End Sub
End Class

然后在Form1 中你会得到类似Dim f2 As Form2 = New Form2(myTextBox.Text) 的东西

其他的方式其实和这个基本相同,除了你可以将Textbox本身作为参数传递给构造函数,或者甚至Form1并在构造函数中赋值Dim X As Form1 = theForm。一般来说,如果您只需要Textbox.Text,那么您应该只在构造函数中接受string。如果您不需要全部控件或表单,则没有理由公开整个控件或表单!

您当前的代码非常接近,但正如 Plutonix 评论的那样,您的Form2X 属性只是Form1另一个实例,而不是应用程序显示的实际实例.

【讨论】:

  • 我喜欢你试图保持简单的方法:
  • KISS 通常是程序员最好的朋友
  • 我喜欢你试图保持简单的方法。我尝试了 Sub New 但是我遇到了一些疯狂的错误,我的表单 2 无法加载。
  • @codeMonger123 你能定义“疯狂错误”吗?您是否包含了将字符串传递给您创建它的 Form2 的第二个 sn-p 代码?
【解决方案3】:

当你这样做时:

Dim X As form1

您正在创建一个对form1 引用。 (并且可能在某处实例化它?或者可能依赖a feature in VB whereby a "default" form instance is used。哪个......不要那样做。相信我,不要这样做。)这个实例与已经存在的实例完全无关。您正在寻找的是对已经存在的实例的引用。

如果form2 依赖于form1 并且需要引用form1 的实例,则需要form2 的构造函数上的引用:

Private Property Form1Instance As form1

Sub New(ByVal form1Instance As form1)
    Me.Form1Instance = form1Instance
End Sub

当您创建form2 的实例时,请为其提供对form1 实例的引用:

Dim form2Instance As New form2(Me)
form2Instance.Show()

然后在form2 中,您可以引用form1 的现有实例:

Dim someVariable As String = Me.Form1Instance.GetTextBox()

【讨论】:

  • Dim X As form1 实际上并没有创建新实例,因为它缺少 new 关键字。
  • @BradleyUffner:好点子。然后,我希望 OP 的代码会生成 NullReferenceException,除非 VB 在幕后做了一些我不熟悉的事情。无论哪种方式,显式引用提供的实例都是可行的方法。
  • @David 我相信 OP 发布的那段代码是为了他们粗略想象的伪代码。
  • @BradleyUffner 不,VB 不这样做。正如预期的那样,Form1 类型的声明变量将是 Nothing。但是,您可以使用表单的类名来访问默认实例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
相关资源
最近更新 更多