设为首页收藏本站language 语言切换
查看: 1742|回复: 0
收起左侧

VB.NET和VC#.NET中控件数组的建立

[复制链接]
发表于 2010-2-25 10:30:07 | 显示全部楼层 |阅读模式
<p >  <b>介绍</b><p >  数组为共享公用功能的一组控件一起工作提供了便捷的途径。例如,一组控件可能用于显示相关的数据,或者在被点击时提供相关的行为。Visual Basic .NET和C#本身并不支持控件数组的建立,但是你可以通过编程复制控件数组的所有功能。本文介绍复制控件数组功能的简单组件的建立。<p >控件数组的主要用处有:<p >  l        使用相同的名称与索引访问一组控件,允许用编号检索和设置数据项并且在整个数组中重复。这个功能可以使用下面的代码实现。<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>' Visual Basic伪代码MyControl(myIndex).MyProperty = myValueMyControl(myIndex + 1).MyMethod// C#伪代码myControl[myIndex].MyProperty = myValue;myControl[myIndex + 1].MyMethod</ccid_code></pre></td></tr></table></ccid_nobr><p >  l        多个对象使用同一个事件处理程序(event handler)处理事件,在这些事件中检索和使用索引,代码如下:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>' Visual Basic伪代码Private Sub MyControl_Click(sender as Object, e as EventArgs)   Messagebox.Show(&quot;You have clicked MyControl number &quot; &amp; _      MyControl.Index)End Sub// C#伪代码private void myControl_Click(System.Object sender, System.EventArgs e)   {      Messagebox.Show(&quot;You have clicked MyControl number &quot; +         myControl.Index);}</ccid_code></pre></td></tr></table></ccid_nobr><p >  l        在运行时动态添加或者删除控件,代码如下:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>' Visual Basic伪代码Dim i as IntegerFor i = 1 to 5   ' 插入代码来建立控件并给属性赋值Next i// C#伪代码for (int i = 1; i &lt; 6; i++){   //插入代码来建立控件并给属性赋值}</ccid_code></pre></td></tr></table></ccid_nobr><p >  Visual Basic .NET和C#允许你复制与控件数组相关的一些功能。例如,你能使用委托把多个对象的事件绑定到一个事件处理程序。但是,如果把这些功能合并到一个动态的、容易管理的组件中更加简便。本文将建立有下面特性的组件:<p >  ·        建立索引和排序控件的集合。将使用按钮集合来演示。<p >  ·        一个事件处理程序来处理衍生的按钮的点击事件。<p >  ·        使用索引引用控件和成员的代码。<p >  ·        给窗体动态添加和删除控件的代码。<p ><p >  <b>预备知识</b><p >  ·        了解属性组件和它们的工作方式。<p >  ·        了解一些组件的多态性<p >  ·        知道Visual Basic .NET或C# .NET的语法。<p >  <b>建立项目</b><p >  在本节中将建立并命名一个项目,并给该项目添加一个类。该类将封装实现控件数组的代码。<p >  1、选择File-> New-> Project菜单打开New Project对话框。<p >  2、从Visual Basic或Visual C#项目列表中选择Windows Application项目模版,在Name框中输入ButtonArrayProject。<p >  3、选择File-> Save All保存项目。<p >  <b>实现一个集合</b><p >  ButtonArray类会处理通过一个集合的实现来保存和组织控件数组的事务。集合是包含索引对象变量列表的对象,也包含add、remove等方法和其它的操作对象。本节中将建立一个继承自System.Collections.CollectionBase(.NET框架组件中提供必要的集合功能的类)的类,并实现提供必要功能的方法。<p >  建立继承类的过程:<p >  1、从Project菜单中选择Add Class。<p >  2、根据情况把类命名为ButtonArray.vb或者ButtonArray.cs。类的代码编辑器将打开。<p >  3、在类的声明中,指定它继承自.NET框架组件的System.Collections.CollectionBase类。<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>' Visual BasicPublic Class ButtonArray   Inherits System.Collections.CollectionBaseEnd Class// C#public class ButtonArray : System.Collections.CollectionBase{   // 省略了设计者增加的代码}</ccid_code></pre></td></tr></table></ccid_nobr><p >  System.Collections.CollectionBase类为集合提供了很多必要的功能。其中包括一个跟踪集合中对象的List对象,维护集合中当前对象数量的Count属性,允许删除特定位置索引的对象的RemoveAt方法。在实现控件数组集合时会使用到它们。<p >  因为每个控件数组与一个窗体关联,索引必须添加一个字段来保存该窗体的引用。通过建立私有的、只读字段来保存引用,可以保证每个控件数组组件只与以一个窗体关联。<p >  <b>为组件建立私有、只读字段</b><p >  立即给类声明添加下面的代码:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>' Visual BasicPrivate ReadOnly HostForm as System.Windows.Forms.Form// C#private readonly System.Windows.Forms.Form HostForm;</ccid_code></pre></td></tr></table></ccid_nobr><p >  在集合中实现的第一个方法是AddNewButton。该方法建立一个新的按钮控件并把它添加到目标窗体。你也可以使用该方法为新按钮设置初始属性。<p >  <b>实现AddNewButton方法</b><p >  在ButtonArray类的代码编辑器中输入下面的代码:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>ublic Function AddNewButton() As System.Windows.Forms.Button   '为Button类建立新的实例    Dim aButton As New System.Windows.Forms.Button()   ' 将该按钮添加到集合的内部列表   Me.List.Add(aButton)   '把控件集合中的按钮添加到被HostForm字段引用的窗体   HostForm.Controls.Add(aButton)   ' 设置该按钮对象的初始属性   aButton.Top = Count * 25   aButton.Left = 100   aButton.Tag = Me.Count   aButton.Text = &quot;Button &quot; &amp; Me.Count.ToString   Return aButtonEnd Function// C# public System.Windows.Forms.Button AddNewButton(){   //为Button类建立新的实例   System.Windows.Forms.Button aButton = new       System.Windows.Forms.Button();   //将该按钮添加到集合的内部列表   this.List.Add(aButton);   //把控件集合中的按钮添加到被HostForm字段引用的窗体   HostForm.Controls.Add(aButton);   //设置该按钮对象的初始属性   aButton.Top = Count * 25;   aButton.Left = 100;   aButton.Tag = this.Count;   aButton.Text = &quot;Button &quot; + this.Count.ToString();   return aButton;}</ccid_code></pre></td></tr></table></ccid_nobr><p >  上面的方法的功能是:<p >  1、建立一个新按钮。<p >  2、把它添加到内部列表和HostForm引用的窗体的控件集合。<p >  3、设置初始属性,包括设置Tag属性来索引该按钮。你可以在这一段中添加代码为控件设置更多的属性。<p >  4、返回新按钮,这样它就能立即被修改并指定给其它的对象引用。<p >  你必须建立一个构造函数(组件被初始化时运行的方法),当控件数组类的一个新实例被建立时,它用来设置HostForm字段的值并把新按钮添加到窗体。可以使用下面的方式达到这个目的。<p >  <b>建立构造函数</b><p >  为类建立构造函数。<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>' Visual BasicPublic Sub New(ByVal host as System.Windows.Forms.Form)   HostForm = host   Me.AddNewButton()End Sub// C# // 使用下面的构造函数代替默认的构造函数public ButtonArray(System.Windows.Forms.Form host){   HostForm = host;   this.AddNewButton();}</ccid_code></pre></td></tr></table></ccid_nobr><p >  构造函数需要一个参数,即放置按钮数组的窗体。它把该值指定给HostForm字段,接着类的AddNewButton方法给窗体添加一个新按钮。<p >  <b>暴露控件数组</b><p >  现在已经建立了建立和跟踪数组中控件的途径,但是还必须把它们暴露给开发者。可以通过属性实现这个功能。我们将建立一个默认属性(Visual Basic)或索引器(C#)基于特定按钮的索引返回它的引用。这样你就能编程使用典型控件数组中的MyButtonArray(myIndex)语法了。<p >建立默认属性<p >  给组件添加下面的代码:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>' Visual BasicDefault Public ReadOnly Property Item(ByVal Index As Integer) As _   System.Windows.Forms.Button   Get      Return CType(Me.List.Item(Index), System.Windows.Forms.Button)   End GetEnd Property// C#public System.Windows.Forms.Button this [int Index]{get   {      return (System.Windows.Forms.Button) this.List[Index];   }}</ccid_code></pre></td></tr></table></ccid_nobr><p >  <b>实现Remove方法  </b><p >  现在已经建立了暴露数组中按钮的属性,可以建立从数组中删除按钮的机制了。为了从数组中删除一个按钮,必须从集合的内部List对象和窗体的Controls集合中删除它。<p >  给组件添加下面的方法:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>' Visual BasicPublic Sub Remove()   ' 检查以确保有按钮可以删除   If Me.Count &gt; 0 Then      ' 从主窗体上的控件集合的数组按钮数组中删除最后一个      ' 注意在访问数组时使用了默认属性      HostForm.Controls.Remove(Me(Me.Count -1))      Me.List.RemoveAt(Me.Count -1)   End IfEnd Sub// C#public void Remove(){   //检查以确保有按钮可以删除   if (this.Count &gt; 0)   {       ' 从主窗体上的控件集合的数组按钮数组中删除最后一个      ' 注意在访问数组时使用了默认属性      HostForm.Controls.Remove(this[this.Count -1]);      this.List.RemoveAt(this.Count -1);   }}</ccid_code></pre></td></tr></table></ccid_nobr><p >  <b>建立公用事件处理程序</b><p >  最后一步是为控件数组建立事件处理程序来处理公用的事件。在演示中,将为按钮的点击事件建立一个方法,接着添加代码把该事件与事件处理程序关联。<p >  <b>建立公用事件处理程序</b><p >  给组件添加下面的方法:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>' Visual BasicPublic Sub ClickHandler(ByVal sender As Object, ByVal e As _   System.EventArgs)   MessageBox.Show(&quot;you have clicked button &quot; &amp; CType(CType(sender, _      System.Windows.Forms.Button).Tag, String))End Sub// C#public void ClickHandler(Object sender, System.EventArgs e){   System.Windows.Forms.MessageBox.Show(&quot;You have clicked button &quot; +       ((System.Windows.Forms.Button) sender).Tag.ToString());}</ccid_code></pre></td></tr></table></ccid_nobr><p >  该方法通过检索存储在按钮的Tag属性的索引,显示一个消息框表明哪个按钮被点击了。该方法的参数与被处理事件的相同,对于事件处理程序是必要的。你也必须把该事件与事件处理程序关联。<p >  <b>把该事件与事件处理程序关联</b><p >  给AddNewButton方法添加下面的代码:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>' Visual BasicAddHandler aButton.Click, AddressOf ClickHandler// C#aButton.Click += new System.EventHandler(ClickHandler);</ccid_code></pre></td></tr></table></ccid_nobr><p >  <b>测试该项目</b><p >  现在组件已经完成了,需要建立一个应用程序来测试该组件。<p >  建立测试应用程序<p >  1、在解决方案管理器中,右键点击Form1并从弹出菜单中选择View Designer。<p >                Form1的设计器被打开了。<p >  2、给窗体添加两个按钮。<p >  3、把这些按钮的位置调整到窗体的右侧。<p >  4、设置这些按钮的属性:<p >  按钮        Name            Text<p >  Button1        btnAdd            Add Button<p >  Button2        btnRemove          Remove Button<p >  5、在解决方案管理器中,右键点击Form1并从弹出菜单中选择View Code。<p >                Form1的代码编辑器被打开了。<p >  6、在Form1的类声明中,声明下面的控件数组对象:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>' Visual Basic' 声明新的ButtonArray对象Dim MyControlArray as ButtonArray// C#//声明新的ButtonArray对象ButtonArray MyControlArray;</ccid_code></pre></td></tr></table></ccid_nobr><p >  7、在窗体的构造函数中,在方法结尾前添加下面的代码:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>' Visual BasicMyControlArray = New ButtonArray(Me)// C#MyControlArray = new ButtonArray(this);</ccid_code></pre></td></tr></table></ccid_nobr><p >  该语句建立了一个新的ButtonArray对象。它的参数(Me或者this)指向建立新ButtonArray的窗体,将成为放置按钮数组的窗体。<p >  注意:在Visual Basic .NET中,构造函数在"Windows Form Designer generated code"代码段中,需要展开这一段查看构造函数。<p >  8、在解决方案管理器中,右键点击Form1并从弹出菜单中选择View Designer。<p >  9、在设计器中双击btnAdd来打开btnAdd_Click事件的代码编辑器。<p >  10、在方法btnAdd_Click中添加代码调用MyControlArray的AddNewButton方法:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>' Visual Basic' 调用MyControlArray的AddNewButton方法MyControlArray.AddNewButton()' 改变Button 0的BackColor属性 MyControlArray(0).BackColor = System.Drawing.Color.Red// C#//调用MyControlArray的AddNewButton方法MyControlArray.AddNewButton();//改变Button 0的BackColor属性MyControlArray[0].BackColor = System.Drawing.Color.Red;</ccid_code></pre></td></tr></table></ccid_nobr><p >  11、在解决方案管理器中,右键点击Form1并从弹出菜单中选择View Designer。<p >  12、在设计器中双击btnRemove来打开btnRemove_Click事件的代码编辑器。<p >  13、在btnRemove_Click方法中添加下面的代码:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>' Visual Basic' 调用MyControlArray的Remove方法MyControlArray.Remove()// C#// 调用MyControlArray的Remove方法MyControlArray.Remove();</ccid_code></pre></td></tr></table></ccid_nobr><p >  14、保存项目<p >  <b>测试该项目</b><p >  1、从Debug菜单中选择Start。<p >  Form1窗体被打开,上面有三个按钮,标签分别是Add Button、Remove Button和Button 1。<p >  2、点击Button 1。<p >        显示了一个消息框,消息框正确地显示了索引。<p >  3、点击几次Add Button按钮。<p >        每次点击会给窗体添加一个新按钮。点击任何一个新按钮将导致一个正确显示该按钮索引的消息框。注意Button 0的颜色改变为红色,是btnAdd_Click事件中下面一行的结果:<p >MyControlArray(0).BackColor = System.Drawing.Color.Red<p >  4、点击几次Remove Button按钮。<p >        每次点击时从窗体上删除一个按钮。<p >  5、点击Remove Button按钮直到窗体右侧的所有按钮都被删除为止。<p >  6、再次点击Add Button按钮。<p >  按钮再次添加到窗体并且索引的编号正确。<p >  <b>结论</b><p >  本文演示了怎样建立封装控件数组功能的组件。你可以看到怎样建立方法来动态地给窗体添加和删除控件,怎样通过默认属性或者索引器暴露对象。上面的代码已经实现了所有的功能,还可以通过为组件编写自定义代码来扩展控件数组。<p ><center class="name02">(责任编辑:西门吹雪)</center><p align="center"></p></p>
您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-5-26 02:30 , Processed in 0.064239 second(s), 24 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

快速回复 返回顶部 返回列表