在VB.NET中传递表单之间的对象值

时间:2015-01-21 02:08:38

标签: vb.net winforms forms class properties

这是我的问题。
我正在VB.NET中创建一个项目(目前)存在于1个类中(我们称之为User.vb)和2个WinForms(frmDisplay& frmMain)。 假设User.vb目前看起来像这样:

Public Class User
  Private mName As String

  Public Sub New(ByVal name As String)
    Me.Name = name
  End Sub

  Public Property Name As String
    Get
        Return mName
    End Get
    Set(value As String)
        mName = value
    End Set
  End Property
End Class

我们还要说frmDisplay形式只是一个带有textfield txtString和btnSend按钮的表单。

Public Class frmDisplay
   Dim usr As New User()

   Private Sub btnSend_Click(sender As Object, e As EventArgs) Handles btnSend.Click
      usr.Name = txtString.Text
      frmMain.Show()
      Me.Hide()
   End Sub
End Class

在表格frmMain上,我想要在第一个表单上的类User中存储的属性Name中的值。 基本的想法是(我知道它不起作用):

Public Class frmMain
   Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
      lblStoredString.Text = usr.Name << This is where I'm stuck
   End Sub
End Class

我搜索了我的问题并阅读了很多帖子,但我似乎无法理解它。也许你们可以帮助我。
我是VB.NET和WinForm-stuff的新手(约3个月的exp。),但我过去在C#中使用webapplications进行了一些编程。
非常感谢每一点帮助。

提前多多感谢!

4 个答案:

答案 0 :(得分:1)

我的重点是ASP.NET,我更喜欢C#,但我会加入。有很多方法可以在表单之间提供数据。想到的第一个是使用某种缓存。我们的想法是,一旦缓存可供您的程序使用,您可以在单击按钮时将值添加到缓存中,然后在需要时安全地读取该值。这可以是带有Dictionary的静态类,或者您可以查看使用System.Web.Caching命名空间提供的功能。 http://www.codeproject.com/Articles/8977/Using-Cache-in-Your-WinForms-Applications有一个例子。

另一种方法是使用共享数据源。这个概念类似于缓存,但是这将允许您在表单之间传递更复杂的关系数据,假设您的真实目标比您描述的更复杂。这是一个演练:https://msdn.microsoft.com/en-us/library/ms171925.aspx

您可以快速而又脏,并将值写入某个位置的文本文件,然后从第二个表单中读取值。

最简单的方法可能是为第二个表单定义一个自定义构造函数,并在实例化第二个表单时传递所需的值。如果可以考虑第一种形式的值,那么这是最合适的。&#34;参数&#34;到第二种形式的实例。 Passing a textbox value from one form to another in windows application

答案 1 :(得分:1)

在整个应用中,您是否只有一个 User.Name

如果是,则将课程更改为:

Public Class User
    Public Shared Name As String
End Class

然后,您可以使用任何形式的User.Name(或应用程序中的任何位置)来获取/设置该值。

请注意,如果您愿意,仍然可以将字段包装在属性中:

Public Class User

    Private Shared _Name As String

    Public Shared Property Name As String
        Get
            Return _Name
        End Get
        Set(value As String)
            If (value.Trim <> "") Then
                _Name = value.Trim
            End If
        End Set
    End Property

End Class

答案 2 :(得分:0)

声明usr变量Friend

Public Class frmDisplay
  Friend usr As New User()

然后可以从其他表格

获得
Public Class frmMain
  Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    lblStoredString.Text = frmDisplay.usr.Name
  End Sub
End Class

这是VB.NET的一个怪癖,表单是使用与类名相同的公共变量名自动创建的。这就是为什么您可以使用frmMain而无需创建它的原因(例如Dim frmMain as New frmMain)。您可以关闭此行为,但这与您的问题无关。

答案 3 :(得分:0)

另一方面,如果你想“正确”......

Public Class frmDisplay
  Private usr As User

  Private Sub btnSend_Click(sender As Object, e As EventArgs) Handles btnSend.Click
    usr = New User(txtString.Text)
    Dim f As New frmMain(Me, usr)
    f.Show()
    Me.Hide()
  End Sub
End Class

和frmMain ......

Public Class frmMain
  Private myParent As Form
  Private usr As User

  Sub New(parent As Form, _usr As User)

    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.
    usr = _usr
    myParent = parent
  End Sub

  Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Label1.Text = usr.Name
  End Sub

  Private Sub frmMain_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
    myParent.Show()
  End Sub

End Class

这里我们实例化frmMain并将User对象传递给它的构造函数。我们还传递了调用表单,以便在frmMain关闭时再次显示它。