Henry手记-VB.net WinForm中的FORM初探(三)

原创 2002年09月27日 11:39:00

Henry手记-VB.net WinForm中的FORM初探(三)

            韩睿(2002.9.25)

 

三、Forms到哪去了?<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

    第一节讲的是一个窗体的类的问题,第两节讨论的是两窗体间的切换

(其实也可以引申为多窗体间的切换),这节讨论一下多窗体的问题。

 

这是vb.net版上一位网友发的询问贴,内容如下:

VB6中可以用

Dim frm As Form

For Each frm In Forms

  ……

Next frm

来取得窗口集合.这个功能在VB.NET中该怎样来完成呢?

先来分析一下Forms的含义与作用:

Forms是一个collection(集合),其元素是进程中被加载的Form

包括MDI FormMDI Child Formnon-MDI Form

Forms集合只有一个属性,就是Count,表明了该集合中有多少元素。

为了达到要求,应该添加自己的forms集合. 

添加一个新的module, 然后在module中写入: 

Module FormsCollection

          Public Forms As New FormsCollectionClass() ‘类定义在后

End Module

  添加一个类模块:

Class FormsCollectionClass

Implements Ienumerable

为使用For each功能,要实现Ienumerable接口,表示公开枚举数,
该枚举数支持在集合上进行简单迭代。

    Private c As New Collection()

Collection 对象提供了一种将一组相关项作为一个对象进行引用的便捷方法。集合中的项

(或成员)只需要存在于集合中即可成为相关项。集合中的成员不需要具有相同的数据类型。

它有两个方法:用Add添加元素,和用Remove从集合中删去元素。它有两个属性:

count来记录元素数目,用只读属性Item返回Collection 对象的特定成员的位置或键

 

    Sub Add(ByVal f As Form) ‘向集合中添加元素的方法

        Dim itemCount As Integer

        For itemCount = 1 To c.Count

      判断f是否在forms中,如果在则不加入

            If f.Name = CType(c.Item(itemCount), Form).Name Then

                Exit Sub

            End If

        Next

        c.Add(f)

    End Sub

 

    Sub Remove(ByVal f As Form) ‘向集合中删除元素的方法

        Dim itemCount As Integer

        For itemCount = 1 To c.Count

       判断f是否在forms中,如果在则删除掉

            If f.Name = CType(c.Item(itemCount), Form).Name Then

                c.Remove(itemCount)

                Exit For

            End If

        Next

    End Sub

 

    ReadOnly Property Item(ByVal index) As Form 返回集合中某个位置的内容

        Get

            Return c.Item(index)

        End Get

    End Property

 

    ReadOnly Property count() As Integer 集合中元素数目的记录

        Get

            Return c.Count()

        End Get

    End Property

 

    Overridable Function GetEnumerator() As _

IEnumerator Implements IEnumerable.GetEnumerator

‘返回可循环访问集合的枚举数。一旦为类定义了Ienumerable接口,就必须要重写

GetEnumerator。调用 GetEnumerator 时,它将构建一个枚举数对象,其中包含集合中

的当前版本号以及对集合项的引用。每次访问枚举数时,它都会将枚举数的版本与集合

的版本进行比较。如果版本不匹配,则认为集合被更改,从而发生异常。

 

        Return c.GetEnumerator

    End Function

End Class

     通过这个类,你可以获得自已的 collection of forms. 现在的Forms具有
collection与枚举的特点。即从 collection中增加或删除相应的form 

在主程序中form1的 New 过程中(被region折起来了,详见本系列讨论的第一节),
 加入下一句:

Forms.Add(Me)

需要注意的是:

这一句话应该要加在InitializeComponent()之后。这是因为,我们防止重复
加入一个form的手段是运用form的name进行判断的。而正如我在第一节中所
描述的那样,系统把初始化的内容,包括name是写在InitializeComponent()
子过程中的。由于每new一个实例,都会调用它一次,所以必须在add方法中
加入判断重复性的内容。

 Dispose 方法中,加入下一句:

Forms.Remove(Me)

在这里,我们可以回顾一下第一节中谈到的析构的问题,由于Forms是全局的,
所以当一个form关闭时,它并没有退出生存期,所以应该将关闭的这个form
从集合中删除掉。为什么关闭时会调用Dispose方法的问题请回头看一下第一节。
你的程序中如果有很多个form,你要在每个form的New与dispose方法里中加入上两句

接下来你就可以使用了:

Dim frm As Form

For Each frm In Forms

     If frm.Name = "Form2" Then

      frm.Close()

End If

Next

现在的forms比以前那一个Count属性的集合使用方法更灵活,内容更多。当然损失的是自动的功能。

在多窗体中使用时,还是请参看第二节的使用方法,综合考虑一下。

 

 

----

  声明:本文版权与解释权归韩睿所有,如需转载,请保留完整的内容及此声明。

QQ: 18349592

Henry手记-VB.net WinForm中的FORM初探(一)

Henry手记-VB.net WinForm中的FORM初探(一)韩睿(2002.9.25) 经常有网友在我主持的版面上发贴子或写信直接来问我,为什么vb.net和vb6差了这么多。当然,问得最多的就...
  • Latitude
  • Latitude
  • 2002年09月25日 22:09
  • 3074

.NET WINFORM(VB(控件开发集合

  • 2009年04月17日 09:32
  • 194KB
  • 下载

Henry手记-VB.net WinForm中的FORM初探(二)

Henry手记-VB.net WinForm中的FORM初探(二)韩睿 (2002.9.25) 二、怎么样切换两个窗体?在上一节中,我们认识到vb.net窗体的新特性,也知道了怎么样show出一个窗体...
  • Latitude
  • Latitude
  • 2002年09月26日 10:05
  • 2488

WebRTC手记之初探

转载请注明出处:http://www.cnblogs.com/fangkm/p/4364553.html  WebRTC是HTML5支持的重要特性之一,有了它,不再需要借助音视频相关的客户端,直...
  • zwz1984
  • zwz1984
  • 2015年11月19日 15:27
  • 365

vb.Net(winform)

  • 2008年06月27日 14:02
  • 7.66MB
  • 下载

Winform程序开发部署流程

经过翻阅资料发现,VS2012虽然没有集成打包工具,但它为我们提供了下载的端口,需要我们手动安装一个插件InstallShield。网上有很多第三方的打包工具,但为什么偏要使用微软提供的呢?因为最原始...
  • Andrewniu
  • Andrewniu
  • 2016年10月25日 11:45
  • 1094

Henry手记:WinForm Datagrid结构剖析(三)

               Henry手记— WinForm Datagrid结构剖析(三)                           韩睿 (2002-12-18) 大家好,很高兴又能和...
  • Latitude
  • Latitude
  • 2002年12月18日 08:50
  • 5940

VB.net WinForm中的FORM初探(三)--iEnumrable 应用

http://blog.csdn.net/latitude/archive/2002/09/27/17209.aspx
  • xiayule
  • xiayule
  • 2004年11月21日 12:18
  • 508

winform开发框架+自动更新源码

  • 2017年06月19日 12:46
  • 802KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Henry手记-VB.net WinForm中的FORM初探(三)
举报原因:
原因补充:

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