我的整个解决方案是否有变量这样的东西?

时间:2011-02-09 13:59:35

标签: .net vb.net winforms

似乎非常初学者, 但我有一个很大的解决方案,问题是当用户在子程序中时我将日期存储在frmMain.vb中的变量中,该变量位于项目1中。用户进入项目B中的用户控件后,我需要具有之前用户存储在frmMain.vb中的相同值。

请您指导一下如何做到这一点?

6 个答案:

答案 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)

您也可以将值存储在数据库中。