似乎非常初学者, 但我有一个很大的解决方案,问题是当用户在子程序中时我将日期存储在frmMain.vb中的变量中,该变量位于项目1中。用户进入项目B中的用户控件后,我需要具有之前用户存储在frmMain.vb中的相同值。
请您指导一下如何做到这一点?
答案 0 :(得分:3)
忘记关于如何使用全局变量的所有噪音。你提出这个问题的事实意味着你是对语言的新手,并希望学习正确的做事方式。 太棒了!
但真正的答案有点复杂。事实是,全局变量大多不受现代编程任务的青睐。特别是VB.NET(与许多其他流行语言一样)是一种面向对象的语言,这意味着您可以与对象的各个实例上的方法进行交互。面向对象的编程提供了许多好处,但也提出了一系列全新的挑战。如果你还没有一本好书,你正在学习VB.NET,我高度建议你现在停下来选一个。
一开始就养成良好习惯要比以后忘掉坏习惯容易得多。相信我,全局变量是一个坏习惯,也是用VB.NET编写代码的错误方法。有 方法,但您不想使用它们。不惜一切代价忽略它们。以“简单”的方式做这件事的诱惑是不值得的。
快速,执行摘要是您需要在表单的类中创建公共属性。 (请记住,在VB.NET中,表单只是一个类的实例。它只是继承自Form
类,因此它可以免费获得所有基本功能。)公共属性是排序类似于一个全局变量,它允许其他类从外部访问该值,但它是面向对象语言中首选的方式。在VB.NET中,公共属性的代码可能如下所示:
Public Class MyForm : Inherits System.Windows.Forms.Form
' Private field (variable), only visible from inside of this class
Private myFavoriteColor As Color = Color.Blue
' Public property to expose favorite color to other classes
Public Property FavoriteColor As Color
Get
' Returns the value of the private variable
Return myFavoriteColor
End Get
Set(ByVal value As Color)
' Sets the private variable to the specified value
myFavoriteColor = value
End Set
End Property
' ... the rest of your form code would go here
End Class
然后从表单的外部,您可能会有以下代码:
Public Class SecondForm : Inherits System.Windows.Forms.Form
Public Sub MyMethod
' Create an instance of the MyForm class
Dim frm As MyForm = New MyForm()
' Show that form
frm.Show()
' Read the value of its favorite color property,
' and display it in a message box
MessageBox.Show(frm.FavoriteColor.ToString)
' ... do whatever else you want to do with that form
' Close the form
frm.Close()
End Sub
' ... other code for the second form might go here
End Class
注意我们如何从完全不同的内部读取存储在frm
对象(MyForm
类的实例)中的变量的值类?这样,您就可以避免存储全局状态信息。相反,您已将这些变量(及其包含的信息)保存在它们适用的特定类中。并且您不必触及并触摸其他类对象的私有部分,因为它使用公共属性正确地将它们暴露给您。这是正确的方法。正如我上面提到的,请确保您从一本好的书中学习,该书教您面向对象的编程以及其他基础知识。你会后悔以任何其他方式做到这一点。
答案 1 :(得分:2)
Amir,这肯定有可能以不同的方式进行,但实际上并非劝阻。
你仍在考虑使用全局变量或对象的VB6模式。
答案 2 :(得分:1)
用户是否控制frmMain
?如果您可以控制它,可以将值传递给用户控件的构造函数。
编辑:如果您无法更改构造函数,则可以在保存此日期的用户控件上添加属性,并且可以在实例化控件时进行设置。在用户控件上,您可以在使用它之前检查此值是否已设置(通过使其为Nullable DateTime类型)。例如,在用户控件上,您可以添加以下内容:
Private _myDateVariable As Nullable(Of Date)
Public Property MyDateVariable() As Nullable(Of Date)
Get
Return _myDateVariable
End Get
Set(ByVal value As Nullable(Of Date))
_myDateVariable = value
End Set
End Property
然后你可以像这样从frmMain访问它(其中myUserControl是你控件的实例):
myUserControl.MyDateVariable = theDateValueYouWantToSet
在控件上使用它时:
If MyDateVariable.HasValue Then
'The date has a value, so you can use it
' Do something with MyDateVariable.Value
Else
' The date has no value, so do something else
End If
答案 3 :(得分:0)
您可以将该变量存储为共享变量,然后可以在代码中的任何位置引用它。
所以在你的frmMain.vb中你有:
Public Shared myVariable as DateTime
然后你可以在任何地方引用它:
NamespaceProject1.frmMain.myVariable
全球价值下的更多信息:
http://www.developerfusion.com/article/1047/new-objectoriented-capabilities-in-vbnet/5/
然而我会坚持使用Davide Piras的建议并且只在需要时才这样做,全局范围内的太多变量将导致难以维护且难以阅读的spagetty代码
答案 4 :(得分:0)
您的解决方案中是否有类似于所有其他项目中引用的Util项目?
您可以从解决方案中的其他任何位置访问全局静态变量。
答案 5 :(得分:0)
您也可以将值存储在数据库中。