这是我的问题。
我正在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进行了一些编程。
非常感谢每一点帮助。
提前多多感谢!
答案 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
关闭时再次显示它。