VB.NET多窗体实际编写方式讲解(下)

原创|其它|编辑:郝浩|2010-01-12 10:28:58.000|阅读 987 次

概述:VB.NET多窗体的编程方式将会以本文介绍的这种方式进行操作。初学者在学习的过程中可以依据这些步骤进行实践操作,以增加其的理解程度。

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

  你需要在首次实例化一个VB.NET多窗体时,把该窗体的实例保存到一个类中:


Dim myNewCust As New 
CustomerForm() 
myNewCust.Show() 
myForms.CustomerForm = 
myNewCust

  这里的 CustomerForm 属性值就是你的窗体实例。于是,其它代码就能从项目的任何地方通过它来间接访问你的窗体了:


Module DoingStuffWithForms 
Sub DoExcitingThings() 
myForms.CustomerForm.Text = _ 
DateTime.Now().T
oLongTimeString 
End Sub
End Module

  象这样把VB.NET多窗体实例保存为属性值就能按照你的要求模拟 Visual Basic 6.0 中的全局变量。如此模拟的“全局变量”其作用域比类域 (class scope) 高一个层次。所谓类域,是指变量仅仅在定义它的类(确切地说,应该包括模块、类或窗体)中有效。比类域还低一层次的是过程域 (procedure scope),即变量仅仅在定义它的例程中有效。

  窗体指针在项目中的传递

  除了把窗体实例全局化以外,你还可以把窗体类指针保存在变量中传递给需要访问该窗体的例程。假设你有一个窗体 Form1,并希望在点击 Form1 中某个按钮 (Button1) 时打开另第二窗体 Form2 ,然后在点击第二窗体 Form2 中的另一个按钮 (Button2) 时进行某项计算。你可以把整个代码都写在 Form1 中,即:


Public Class Form1    
Inherits System.Windows.Forms.Form    
Dim myForm2 As Form2    
Private Sub Button1_Click
(ByVal sender As System.
Object,_ ByVal e As System.
EventArgs) Handles Button1.Click    
myForm2 = New Form2()    
myForm2.Show()    
End Sub    
Private Sub Button2_Click
(ByVal sender As System.Object, 
_ByVal e As System.EventArgs) 
Handles Button2.Click    
Calculations.CompoundInterest
Calc(myForm2)    
End Sub    
End Class  

 

  无论是把窗体指针全局化,还是把它以参数的形式传递,都是可行的。然而,你必须根据项目的需要选择最佳方案。当 .NET 项目中只有少数几个过程需要访问特定窗体时,我建议你给这些过程增加一个参数,以在必要时接受窗体指针。当你的项目有太多过程需要访问该窗体时,你就应该考虑设置一个全局窗体指针变量。当然了,你最好还是考虑调整项目代码结构,使得真正访问该窗体的类或者过程只有一个。如果你希望用窗体来显示登录信息,则你可以先创建一个类,把VB.NET多窗体实例保存为它的 Shared 类成员,然后添加一个 Shared 方法 WriteToLogWindow 来完成实际的窗体访问。于是,项目中的任何代码只需调用此 WriteToLogWindow 方法就能间接访问显示登录信息的窗体了:


Public Class Log    
Private Shared m_LogForm As Form2    
Public Shared Property LogForm() 
As Form2    
Get    
Return m_LogForm    
End Get    
Set(ByVal Value As Form2)    
m_LogForm = Value    
End Set    
End Property    
Public Shared Sub WriteToLogWindow
(ByVal Message As String)    
Dim sb As New _    
StringBuilder(m_LogForm.txtLog
Info.Text)    
sb.Append(Environment.NewLine)    
sb.Append(Message)    
m_LogForm.txtLogInfo.Text = 
sb.ToString()    
End Sub    
End Class 

 

  读取和改变VB.NET多窗体内的信息

  到现在为止,我们讨论的只是如何创建和访问窗体实例,而没有涉及如何读取或改变窗体内的信息。如果你的窗体已经按照前述方法实例化,并且访问窗体的代码都位于窗体所在的项目中,则你可以直接操作窗体中的任何控件来读取和改变窗体内的信息。但我觉得这样并不理想。与其直接访问窗体中的文本框、按钮等控件,还不如增加一个 Public 属性,通过它来控制窗体中的控件。如果你有意尝试这种特殊的窗体访问方式,请跟我来:

  在 Visual Basic .NET 中新建一个 Windows 应用程序项目。

  此时项目中已经自动生成了一个窗体 Form1 。现在添加另一个窗体 Form2 :在“解决方案资源管理器”中按右键单击项目名称 -> “添加” -> “添加 Windows 窗体” -> 点击“打开”以接受默认名称 Form2.vb 。

  在 Form1 中添加两个按钮,分别按照默认值命名为 Button1 和 Button2 ,并且调整它们在窗体中的位置以免重叠。

  在 Form2 中添加一个简单文本框,按照默认值命名为 TextBox1

  把下列代码添加到 Form2 的“End Class”前面 (在“解决方案资源管理器”中按右键单击 “Form2”-> “查看代码”,再粘贴下列代码):


Public Property CustomerName()
 As String    
Get    
Return TextBox1.Text    
End Get    
Set(ByVal Value As String)    
TextBox1.Text = Value    
End Set    
End Property

 

  接下来要做的是:

  a. 切换到 Form1 的代码,在 “Inherits System.Windows.Forms.Form” 后面增加一行:


Dim myForm2 As New Form2()

  b. 在 Form1 中双击Button1 按钮,在它的 Click 事件处理程序代码中输入下列代码: 


myForm2.CustomerName = "Fred" myForm2.Show()

  c. 在 Form1 中双击Button2 按钮,在它的 Click 事件处理程序代码中输入下列代码:


 MessageBox.Show(myForm2.CustomerName) myForm2.CustomerName = "Joe"

  d. 按 F5 运行项目,并点击窗体中的 Button1 和 Button2 按钮,以观察代码运行情况。

  表面看来,通过 CustomerName 属性来访问 Form2 与直接访问 Form2 非常相似。然而,这种间接的窗体访问方式能够带来很多好处,其中最重要的一点就在于它实现了更高的抽象性。换言之,哪怕你不知道 Form2 中控件的任何细节 (比如:窗体中是否包含 textbox 控件) ,也能与 Form2 交换数据;你所要做的只是读取或设置 CustomerName 属性值而已。有了这种抽象,你就能在修改 Form2 的实现时不影响项目中的其它代码,因而大大简化了整个项目代码的维护。

  单从本文的例子来看,这种基于属性的窗体编程模式似乎并不比常规方式简单。然而,它以属性的形式隐藏了窗体的全部细节,故能用简洁、一致的代码来访问窗体。所以,它在一些相当复杂的用户界面编程中能够大显身手。总而言之,通过属性值来访问窗体及其控件的编程模式虽然不太直观,却对程序员很有价值:它不但比直接访问窗体的编程模式来得更专业,而且让整个项目的代码清晰易读。

  结论

  Visual Basic .NET 取消了早期版本中的“默认窗体实例”,却引起了不少 .NET 编程新手的困惑。Visual Basic .NET 规定,只有通过引用窗体实例,才能访问窗体的属性、方法及其控件。你所保存的窗体实例指针应该尽量让整个项目都能直接访问到它。VB.NET多窗体处理机制已经变得更合理、更强大。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:网络转载

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP