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

Passing values of an object between forms in VB.NET

这是我的问题。
我正在 VB.NET 中创建一个项目,该项目(当前)存在于 1 个 class(这里我们称之为 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 只是一个带有文本字段 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 上,我想获得存储在第一个表格的 class 用户中的 属性 名称中的值。 基本思路是(我知道不行):

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 个月的经验),但我过去用 C# 和 webapplications 做过一些编程。
非常感谢您的每一点帮助。

非常感谢!

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

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

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

最简单的方法可能是为第二种形式定义一个自定义构造函数,并在实例化第二种形式时传递您需要的值。如果可以将第一种形式的值视为 "parameters" 到第二种形式的实例,则这最适合。 Passing a textbox value from one form to another in windows application

声明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 的一个怪癖是自动创建的表单具有与 class 名称相同的 public 变量名称。这就是为什么您可以使用 frmMain 而无需创建它(例如 Dim frmMain as New frmMain)。您可以关闭此行为,但这与您的问题无关。

在整个应用程序中,您是否只会 一个 User.Name 感兴趣?

如果是,则将class改为:

Public Class User
    Public Shared Name As String
End Class

然后您可以从任何表单(或应用程序中的任何位置)使用 User.Name 到 get/set 该值。

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

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

另一方面,如果您想这样做 "properly"...

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 关闭时再次显示它。