`
leonardleonard
  • 浏览: 778603 次
社区版块
存档分类
最新评论

.NET中添加控件数组

阅读更多

作者:cuike519的专栏   http://blog.csdn.net/cuike519/


添加控件数组

.NET里面我好像没有找到有关于控件数组的说明,但是前两天偶在网上看到了一篇关于如何在.NET里面实现控件数组的文章(该文章请参看MSDN).记得大学的时候在使用VB的时候使用过控件数组,可是到了.NET的时代好像没有了.当时可以用控件数组作很多繁琐的事情,可以动态的生成一些功能和目的基本相同的一组文本框和一堆标签.这些控件数组响应同一个事件,我们在使用它的时候可以直接通过索引来访问.我使用.NET以后好像绑定让一切变的如此简单,好像控件数组没有什么用了,但是在前面的一次开发中我还是偶然的想到了使用控件数组,苦于不知道如何申明后来发现.NET不支持这个东东了.其实如果我们很了解FCL的话我想这个实现起来也不难!好了废话就不说了下面开始我们的创建工作.这次我们创建的是Button的数组(也是MSDN上的例子.本文的原型以及代码均来自MSDN,如果想要了解更多的详细信息请参考MSDN的帮助),首先我们用到了CollectionBase (请参考http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemcollectionscollectionbaseclasstopic.asp) ,该类提供了一个抽象的强类型集合的基类.我们可以用它来实现我们的控件数组.首先我们需要建立一个从CollectionBase继承的类,我们称之为ButtonArray.用来做存放Button的容器.下面是实现的代码:

namespace ButtonArrayProject{

      

       using System;

       /// <summary>

       /// ButtonArray 的摘要说明。

       /// </summary>

       public class ButtonArray : System.Collections.CollectionBase{

<!----><o:p> </o:p>

              // 容器的一个引用,引用该控件数组所在的窗体的一个引用

              private readonly System.Windows.Forms.Form HostForm;

<o:p> </o:p>

              // 添加一个新的按钮

              public System.Windows.Forms.Button AddNewButton(){

                     // 创建一个新的按钮实例

                     System.Windows.Forms.Button aButton = new System.Windows.Forms.Button();

                     // 将该新的控件添加到(this)列表中

                     this.List.Add(aButton);

                     // 将控件添加到父窗体的控件集合中

                     HostForm.Controls.Add(aButton);

                     // 设置该控件的属性

                     aButton.Top = Count * 25;

                     aButton.Left = 100;

                     // ButtonTag表示控件数组中的索引

                     aButton.Tag = this.Count;

                     aButton.Text = "Button " + this.Count.ToString();

                     // 添加一个事件响应

                     aButton.Click += new System.EventHandler(ClickHandler);

                     // 返回该新的控件

                     return aButton;

              }

<o:p> </o:p>

              // 删除控件数组中的最后一个元素

              public void Remove(){

                     // 检测该控件数组中是否有控件

                     if(this.Count > 0){

                            // 如果有则先从父容器中删除最后一个元素

                            // 注意:此处是通过索引访问

                            this.HostForm.Controls.Remove(this[this.Count-1]);

                            // 删除控件数组中的最后一个控件

                            this.List.RemoveAt(this.Count-1);

                     }

              }

<o:p> </o:p>

              // 添加一个事件出来函数

              public void ClickHandler(Object sender, System.EventArgs e) {

                     // MessageBox返回一条消息

                     System.Windows.Forms.MessageBox.Show("你点击的是 " +

                            ((System.Windows.Forms.Button) sender).Tag.ToString());

              }

<o:p> </o:p>

              // 带父窗体引用的构造函数

              public ButtonArray(System.Windows.Forms.Form host){

                     // 为父窗体的引用赋值

                     this.HostForm = host;

                     // 添加一个默认的按钮

                     this.AddNewButton();

              }

<o:p> </o:p>

              // 控件数组的索引可以利用索引访问(只能得到)

              public System.Windows.Forms.Button this[int index]{

                     get{

                            return (System.Windows.Forms.Button)this.List[index];

                     }

              }

       }

}

<o:p> </o:p>

为了测试程序我们添加一个WinForm的工程.在该工程的Form1中放入两个Button用来添加或者删除控件数组中的控件.同时我们还需要在Form1中声明一个ButtonArray的对象.Form1的构造函数中实例该对象, 代码如下:

using System;<o:p></o:p>

using System.Drawing;<o:p></o:p>

using System.Collections;<o:p></o:p>

using System.ComponentModel;<o:p></o:p>

using System.Windows.Forms;<o:p></o:p>

using System.Data;<o:p></o:p>

<o:p> </o:p>

namespace ButtonArrayProject<o:p></o:p>

{<o:p></o:p>

       public class Form1 : System.Windows.Forms.Form{<o:p></o:p>

<o:p> </o:p>

              private ButtonArray btnArray ;<o:p></o:p>

              private System.Windows.Forms.Button btnAdd;<o:p></o:p>

              private System.Windows.Forms.Button btnRemove;<o:p></o:p>

              private System.ComponentModel.Container components = null;<o:p></o:p>

<o:p> </o:p>

              public Form1(){<o:p></o:p>

                     InitializeComponent();<o:p></o:p>

                     this.btnArray = new ButtonArray(this);<o:p></o:p>

              }<o:p></o:p>

<o:p> </o:p>

              protected override void Dispose( bool disposing ){<o:p></o:p>

                     if( disposing )<o:p></o:p>

                     {<o:p></o:p>

                            if (components != null) <o:p></o:p>

                            {<o:p></o:p>

                                   components.Dispose();<o:p></o:p>

                            }<o:p></o:p>

                     }<o:p></o:p>

                     base.Dispose( disposing );<o:p></o:p>

              }<o:p></o:p>

<o:p> </o:p>

              #region Windows <o:p></o:p>

              private void InitializeComponent()     {<o:p></o:p>

                     this.btnAdd = new System.Windows.Forms.Button();<o:p></o:p>

                     this.btnRemove = new System.Windows.Forms.Button();<o:p></o:p>

                     this.SuspendLayout();<o:p></o:p>

                     // <o:p></o:p>

                     // btnAdd<o:p></o:p>

                     // <o:p></o:p>

                     this.btnAdd.Location = new System.Drawing.Point(352, 136);<o:p></o:p>

                     this.btnAdd.Name = "btnAdd";<o:p></o:p>

                     this.btnAdd.Size = new System.Drawing.Size(112, 23);<o:p></o:p>

                     this.btnAdd.TabIndex = 0;<o:p></o:p>

                     this.btnAdd.Text = "AddNewButton";<o:p></o:p>

                     this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click);<o:p></o:p>

                     // <o:p></o:p>

                     // btnRemove<o:p></o:p>

                     // <o:p></o:p>

                     this.btnRemove.Location = new System.Drawing.Point(352, 192);<o:p></o:p>

                     this.btnRemove.Name = "btnRemove";<o:p></o:p>

                     this.btnRemove.Size = new System.Drawing.Size(112, 23);<o:p></o:p>

                     this.btnRemove.TabIndex = 1;<o:p></o:p>

                     this.btnRemove.Text = "RemoveButton";<o:p></o:p>

                     this.btnRemove.Click += new System.EventHandler(this.btnRemove_Click);<o:p></o:p>

                     // <o:p></o:p>

                     // Form1<o:p></o:p>

                     // <o:p></o:p>

                     this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);<o:p></o:p>

                     this.ClientSize = new System.Drawing.Size(512, 381);<o:p></o:p>

                     this.Controls.Add(this.btnRemove);<o:p></o:p>

                     this.Controls.Add(this.btnAdd);<o:p></o:p>

                     this.Name = "Form1";<o:p></o:p>

                     this.Text = "Form1";<o:p></o:p>

                     this.ResumeLayout(false);<o:p></o:p>

<o:p> </o:p>

              }<o:p></o:p>

              #endregion<o:p></o:p>

<o:p> </o:p>

              [STAThread]<o:p></o:p>

              static void <!----><st1:place w:st="on">Main</st1:place>() {<o:p></o:p>

                     Application.Run(new Form1());<o:p></o:p>

              }<o:p></o:p>

<o:p> </o:p>

              private void btnAdd_Click(object sender, System.EventArgs e) {<o:p></o:p>

                     this.btnArray.AddNewButton();<o:p></o:p>

// 这里就是通过索引访问的实例<o:p></o:p>

                     this.btnArray[0].BackColor = Color.Blue;<o:p></o:p>

              }<o:p></o:p>

<o:p> </o:p>

              private void btnRemove_Click(object sender, System.EventArgs e) {<o:p></o:p>

                     this.btnArray.Remove();<o:p></o:p>

              }<o:p></o:p>

       }<o:p></o:p>

}<o:p></o:p>


分享到:
评论

相关推荐

    vs2008 动态添加控件数组并获取所点击的控件属性

    一个在vs2008下 动态添加控件数组并获取所点击的控件属性(vb编程)的源码

    C#变通方法实现VB6.0里面的控件数组,VB.net也同样

    C#变通方法实现VB6.0里面的控件数组,当然VB.net也可以用,,用了三种方法 ,代码添加事件,属性页里设置事件,判别并处理.

    asp.net客户端动态生成控件

    主要实现客户端页面上的控件动态生成。实现无限添加。

    vb.net基本入门学习资料

    1.vb.net中给一个类添加方法 2.命名属性、方法和事件 3.vb.net的事件和事件处理 4.类的继承(Inheritance) 5.vb.net继承的规则 6.用继承建立一个继承类 7.重载Windows控件 8.什么时候使用继承 9.什么是命名空间...

    vb.net基本入门学习资料.doc

    1.vb.net中给一个类添加方法 2.命名属性、方法和事件 3.vb.net的事件和事件处理 4.类的继承(Inheritance) 5.vb.net继承的规则 6.用继承建立一个继承类 7.重载Windows控件 8.什么时候使用继承 9.什么是命名空间...

    spring.net中文手册在线版

    17.6.2.在.NET 2.0中执行回调 17.6.3. .NET 1.1 17.6.4.AdoTemplate方法指南 17.7.异常翻译 17.8.参数管理 17.8.1. IDbParametersBuilder 17.8.2. IDbParameters 17.9. Mapping DBNull values 17.10. Basic data ...

    2.ASP.NET.2.0.高级编程(第4版) [1/7]

    6.3.5 把文件内容从Stream对象移动到Byte数组中 175 6.4 MultiView和View服务器控件 175 6.5 Wizard服务器控件 179 6.5.1 定制边栏导航 181 6.5.2 AllowReturn属性 182 6.5.3 使用StepType属性 182 6.5.4 给...

    ASP.NET 3.5 开发大全

    1.1.5 ASP.NET 3.5新增控件 1.1.6 ASP.NET 3.5 AJAX 1.2 .NET应用程序需框架 1.2.1 什么是.NET应用程序框架 1.2.2 公共语言运行时(CLR) 1.2.3 .NET Framework 类库 1.3 安装Visual Studio 2008 1.3.1 安装Visual ...

    ASP.NET3.5从入门到精通

    1.1.5 ASP.NET 3.5 新增控件 1.1.6 ASP.NET 3.5 AJAX 1.2 .NET 应用程序需框架 1.2.1 什么是.NET 应用程序框架 1.2.2 公共语言运行时(CLR) 1.2.3 .NET Framework 类库 1.3 安装Visual Studio 2008 1.3.1 安装...

    ASP.NET 3.5 开发大全word课件

    1.1.5 ASP.NET 3.5新增控件 1.1.6 ASP.NET 3.5 AJAX 1.2 .NET应用程序需框架 1.2.1 什么是.NET应用程序框架 1.2.2 公共语言运行时(CLR) 1.2.3 .NET Framework 类库 1.3 安装Visual Studio 2008 1.3.1 安装Visual ...

    ASP.NET2.0高级编程(第4版)1/6

    本书全面介绍了ASP.NET各种编程技能和2.0版中的巨大变化,并详细阐述了2.0版中的每个新特性。书中提供了大量的实例,可帮助读者快速掌握如何在.NET平台下开发功能强大的ASP.NET应用程序。本书适合有一些基础的ASP...

    ASP.NET 3.5 开发大全11-15

    1.1.5 ASP.NET 3.5新增控件 1.1.6 ASP.NET 3.5 AJAX 1.2 .NET应用程序需框架 1.2.1 什么是.NET应用程序框架 1.2.2 公共语言运行时(CLR) 1.2.3 .NET Framework 类库 1.3 安装Visual Studio 2008 1.3.1 安装Visual ...

    ASP.NET 3.5 开发大全1-5

    1.1.5 ASP.NET 3.5新增控件 1.1.6 ASP.NET 3.5 AJAX 1.2 .NET应用程序需框架 1.2.1 什么是.NET应用程序框架 1.2.2 公共语言运行时(CLR) 1.2.3 .NET Framework 类库 1.3 安装Visual Studio 2008 1.3.1 安装Visual ...

    [ASP.NET.AJAX编程参考手册(涵盖ASP.NET.3.5及2.0)].(美)霍斯拉维.扫描版.pdf

    ASP.NET AJAX将ASP.NET/.NET Framework中的服务器端编程技术引入到客户端框架,从而带来了客户端编程的丰富特性。本书主要阐述ASP.NET AJAX是如何在客户端模拟这些丰富特性的。 本书通过大量实例、深入的描述以及...

    .net50个常用方法简单华丽的分页控件功能大的分页控件 50个实用方法

    ///FileTxtReader()读取TXT文本 Txt 文本的地址 返回一个数组 每一行为数组里的一个元素 ///StringEncrypt() DES字符串加密中文不可以加密 ///StringDecrypt()DES解密字符串 ///StringMD5Encrypt()MD5加密...

    零基础学ASP.NET 2.0电子书&源代码绝对完整版1

    4-01.aspx aspx页面中添加一个Lable标签。 4-02.aspx 读出Application的属性值。 4-03.aspx 读出SessionID的值。 4-04.aspx 创建Session对象。 4-05.aspx 读取传递的Session值并显示。 4-...

    ASP.NET编程之道.part1.rar

    谬误15 .Net中的数组类型和C++的数组没有区别 谬误16 泛型不被指定的情况下是不确定的类型 谬误17 Object类型比较方法上的一些误解 谬误18 .NET中的线程等价于Win32线程 谬误19 TextBox控件依靠ViewState保存状态...

Global site tag (gtag.js) - Google Analytics