【问题标题】:Passing values of an object between forms in VB.NET在 VB.NET 中的窗体之间传递对象的值
【发布时间】:2015-03-19 10:55:49
【问题描述】:

这是我的问题。
我正在 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 表单只是一个带有文本字段 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 个月的经验),但我过去在 C# 中使用 Web 应用程序进行过一些编程。
非常感谢您的每一点帮助。

提前非常感谢!

【问题讨论】:

  • 如果用户对两种表单都很重要,则使其成为全局。创建一个模块,添加Friend Usr As User。然后创建一个实例:usr = New User(无 Dim)。现在,两种形式都可以访问它。最好也使用显式表单实例。
  • 使用每个表单都可以读取的共享模型。表单是 UI,不应该是数据存储库。无论@Plutonix 提出什么建议也是一个坏主意。

标签: vb.net winforms forms class properties


【解决方案1】:

另一方面,如果你想“正确”地做到这一点......

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 并将用户对象传递给它的构造函数。我们还传递了调用表单,以便在frmMain 关闭时再次显示它。

【讨论】:

  • 是否在Sub New()Form_Load 中设置Label1.Text 属性是另一个争论,哈哈。我更喜欢将它放在 Form_Load 中,因为某些控件在 ctor 之后会进行一些渲染等,这可能(对于更复杂的 winform 控件)会导致意想不到的效果。
【解决方案2】:

在整个应用程序中是否只有 一个 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

【讨论】:

  • Private usr As User 设置为Public Shared usr As User 解决了这个问题。非常感谢!
【解决方案3】:

声明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)。您可以关闭此行为,但它与您的问题无关。

【讨论】:

  • 您说的是表单的“默认实例”。但是,即使是默认实例,frmDisplay 的每个实例仍将拥有自己的“usr”副本。但是,如果您将 Friend 更改为 Shared,则所有 frmDisplay 实例将共享同一个 User 实例,使其成为全局实例。
  • 是的,这是一个 VB.NET 解决方案,它不适用于 C#。提问者肯定在使用默认实例。如果您想要更通用的 C# 友好解决方案,请使用 M J Heier 提出的自定义构造函数解决方案。提问者似乎是新手,我的解决方案更简单。
【解决方案4】:

我的重点是 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

您可能又快又脏,将值写入某个位置的文本文件,然后从第二种形式中读取值。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多