2011-02-09 76 views
2

似乎很初学者, 但我有一个很大的解决方案,问题是当用户在一个子例程中我将日期存储在frmMain.vb中的一个变量中,该变量基于项目1.用户步入项目B中的用户控件,我需要具有与用户存储在frmMain.vb中相同的值。作为我整个解决方案的变量是否有这样的事情?

请问你能指导我如何可能吗?

+0

要确认,您有两个单独的项目,并且您需要一个在两个项目中都可见的变量。 – Jonathan 2011-02-09 14:07:36

+0

frmFacility.vb及其用户控件是ucBookCtrl.vb – amir 2011-02-11 14:45:10

回答

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 
+0

我想到了这一点,但不幸的是我正在开发一个更新的版本,所以我的经理需要的更少的更改! – amir 2011-02-09 14:38:21

0

可以存储变量作为一个共享变量之后就可以引用它在你的代码的任何地方。

所以你frmMain.vb您有:

Public Shared myVariable as DateTime 

然后你可以参考它的任何地方像这样:

NamespaceProject1.frmMain.myVariable 

更多的信息在这里下全局值

http://www.developerfusion.com/article/1047/new-objectoriented-capabilities-in-vbnet/5/

不过我要坚持达维德Piras酒店的意见和只能这样做需要的时候,在全球范围内的变数太多会导致难以维护,难以阅读spagetty代码

2

阿米尔,这肯定是可能以不同的方式,但它确实没有气馁。

你仍然在用全局变量或对象周围的VB6模式思考。

+2

全局变量在VB 6中也不对。如果有人问到有关VB 6的这个问题,有人可能会正确地告诉OP“你仍然在用QuickBASIC模式思考全局变量”。 – 2011-02-09 14:15:49

0

您的解决方案中是否有像所有其他项目中引用的Util项目一样的东西?

您可以在解决方案的其他任何地方都可以访问全局静态变量。

+0

不幸! – amir 2011-02-09 14:37:04

3

忘掉所有关于如何使用全局变量的噪音。你提出这个问题的事实意味着你对这门语言很陌生,并且想要学习正确的做事方式。 太棒了!

但真正的答案有点复杂。事实是,全球变量大多已经不适合现代编程任务。 VB.NET特别是(与很多其他流行语言)是10面向对象语言,这意味着你与个别对象实例上的方法进行交互。面向对象的编程提供了许多好处,但也带来了全新的挑战。如果你还没有一本好书,你正在学习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类的一个实例)内的变量的值?这样,您就避免了存储全局状态信息。相反,您将这些变量(及其包含的信息)保存在它们适用的特定类中。而且您不必触及其他类对象的私有部分,因为它使用公共属性正确地向他们公开了它们。这是做到这一点的正确方法。正如我上面提到的,确保你从一本教好你的书中学习,这本书教你面向对象编程和其他基础知识。你会后悔做任何其他方式。

0

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

相关问题