博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

学习:再谈.NET下窗体访问

Posted on 2006-06-17 12:04  李玉锋  阅读(1942)  评论(6编辑  收藏  举报
                                                               学习:再谈.NET下窗体访问

作为一名与VB6.0相伴多年的开发者,在转入.NET的开发时,遇到有趣而又备感不爽的首个问题是什么呢?是面向对象的概念,最明显的一个问题便是多个窗体间的互访通信,在很多论坛中关于这个问题的讨论也特别多。在此,主要讨论VB2005下的一个令人意外新的方法,首次作文,颇感羞涩,不足之处请谅之。

还记得在VB6.0下在一个窗体下访问另一个窗体的方便,直接通过窗体名就可以实现。而在VB.NET2003下这个方法却失效了,因为要遵守面向对象的金科玉律,就不得不要绕个弯来完成,我在开发中最常用的一个方法是通过窗体的Sub New()构造函数来传递窗体的引用,以下为示例VB.NET2003代码。

Form2.vb:

Public Class Form2

Inherits System.Windows.Forms.Form

Private FirstForm As Form

  Public Sub New(ByVal frm As Form)

        MyBase.New()

        InitializeComponent()

        FirstForm = frm

    End Sub

End Class

Form1.vb:

Public Class Form1

Inherits System.Windows.Forms.Form

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim SecondForm As New Form2(Me)

        SecondForm.Show()

    End Sub

End Class

上面的代码通过From2的构造函数把From1的引用传递到Form2中,这样在Form2中便可以通过Form1的引用FirstForm访问Form1公开的成员,从而实现窗体互通。当然,窗体通信还有一些其它的方法,比如利用委托,属性等。

   本来我的窗体构造函数传递窗体引用的方法在VB.NET2003下使用的一直很好,但在VB2005下这个方法却是又一次失效了,因为VB2005下把New构造函数给彻底的隐藏了,没有办法再用上面的方法修改,并且不允许通过Overloads关键字重载New(),这一下子又变成了难题,心里也给微软给整的上火,怎么办呢?呵呵,微软给我们提供了一个相当让人惊奇的方法,看下面VB2005的代码。

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Form2.Show()

    End Sub

End Class

Public Class Form2

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Form1.BackColor = Color.Blue

        Form1.Visible = False

    End Sub

End Class

看到上面的代码你第一感觉是什么,是不是觉得很熟悉?惊讶于这不是VB6.0中窗体互访的代码吗?是呀,微软响应呼声,又把以前VB6.0里的访问方式给拿到了VB2005里,VB.NET2003里,为了追求VB的完全的面向对象,可能对于VB6的改造有点过火了,一些很方便的特性也给抛弃了。幸好现在有给加进去了,通过VB6.0这种访问窗体的代码方式真是方便多喽,只不过VB2003用了这么久,一下子还真有点不习惯。那么,VB2005里这项功能是如何实现的呢?这都要归功与My关键字了。

My命名空间中的对象Forms中维护着当前项目中声明的每个 Windows 窗体的实例,提供了对在启动时创建的应用程序主窗体实例的访问。对于所有其他窗体,My.Forms 对象创建一个新的窗体实例(在它被访问时),并存储该实例,以后再访问该窗体将直接返回此窗体实例。可以通过使用窗体名称访问由 My.Forms 对象提供的窗体,也就是说My.Forms.Form2.Show Form2.Show是等效的CLR执行体运行对窗体操作的代码时,比如上面的Form1.BackColor = Color.Blue它便会自动的到My.Froms维护的窗体实例中去查找窗体的实例引用,在此便会查找Form1,由于是第一次访问,所以会创建一个新的Form1窗体实例,对于Form1.Visible = False这段代码,将直接返回My.FormsFrom1的引用。当然,对于你确定不再使用的窗体可以通过 Nothing 赋予该窗体的属性来释放窗体(当然这还要取决于垃圾回收器释放内存的时机),以节省资源。

好了,我的第一篇文章就要结束了,按照惯例最后得说两句,呵呵!还是赞叹一下My关键字吧,通过它,微软给我们提供了很多强大的功能,其中很多功能感觉怀旧,很亲切的,你会发现在工作中接触到My关键在机会很多的。