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

原创 2006年06月07日 23:34:00

                                          学习:再谈.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关键字吧,通过它,微软给我们提供了很多强大的功能,其中很多功能感觉怀旧,很亲切的,但愿都能把它当作朋友,因为朋友最能帮人啦!

谈基于.net平台windows开发中的模式窗体

谈基于.net平台windows开发中的模式窗体发布日期: 2006-04-23 | 更新日期: 2006-05-05作者:郑佐适用于: Windows 操作系统.NET Framework 1.x,...

谈.Net委托与线程——解决窗体假死

引言   在之前的《创建无阻塞的异步调用》中,已经介绍过异步调用的编写步骤和实施原理。异步调用是CLR为开发者提供的一种重要的编程手段,它也是构建高性能、可伸缩应用程序的关键。在多核CPU越来越...

谈.Net委托与线程——解决窗体假死(三)

引言   在之前的《创建无阻塞的异步调用》中,已经介绍过异步调用的编写步骤和实施原理。异步调用是CLR为开发者提供的一种重要的编程手段,它也是构建高性能、可伸缩应用程序的关键。在多核CPU越来越普及...
  • cqkxzyi
  • cqkxzyi
  • 2014年11月14日 23:30
  • 924

谈基于.net平台windows开发中的模式窗体

发布日期: 2006-04-23 | 更新日期: 2006-05-05 作者:郑佐 适用于: Windows 操作系统  .NET Framework 1.x,2.0运行时环境  .NET W...

.NET中窗体间相互访问的几种方式

.NET中窗体间相互访问的几种方式 在我们的程序中,窗体之间经常要相互访问彼此的成员,调用彼此的方法,或者激发彼此的事件。下面就我的经验,简单谈谈在.NET中窗体间相互访问的几种方式。 以下给出了C#...

谈.Net委托与线程——解决窗体假死

引言   在之前的《创建无阻塞的异步调用》中,已经介绍过异步调用的编写步骤和实施原理。异步调用是CLR为开发者提供的一种重要的编程手段,它也是构建高性能、可伸缩应用程序的关键。在多核CPU越来越普及...
  • jianwt
  • jianwt
  • 2012年10月30日 15:45
  • 6298

谈.Net委托与线程——解决窗体假死

引言   在之前的《创建无阻塞的异步调用》 中,已经介绍过异步调用的编写步骤和实施原理。异步调用是CLR为开发者提供的一种重要的编程手段,它也是构建高性能、可伸缩应用程序的关键。在多核CPU越来...

谈基于.net平台开发中的模式窗体

适用于: .NETFramework1.x,2.0运行时环境 .NETWindows开发VisualStudio2005 摘要:本文阐述了在基于.NET平台的Windows程序开发中使用模式...
  • yeqishi
  • yeqishi
  • 2011年12月05日 01:17
  • 690

谈.Net委托与线程——解决窗体假死

[转自]http://www.cnblogs.com/smartls/archive/2011/04/08/2008981.html#2104297 引言   在之前的《创建无阻塞的异...

asp.net中的窗体身份验证(不同的角色访问不同的目录)

在《asp.net中的窗体身份验证(最简单篇)》说明了如何让通过了身份验证的用户访问网站,但是该方法中有一个缺点,就是访问整个网站都需要用户身份验证。因此,在《asp.net中的窗体身份验证(分目录验...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:学习:再谈.NET下窗体访问
举报原因:
原因补充:

(最多只允许输入30个字)