C# 中的动态创建技术

简介:

[转载]原文出处  http://blog.csdn.net/baiyun789/article/details/6156694

                       第一部分 WinForm控件在窗体中动态居中创建、删除控件及对其赋值

一、以lable为例:

在Form中放一个控件,让其在启动和动态改变窗口大小时始终居中

intgLeft=this.Width/2-lable1.Width/2;  //this指Form

intgTop=this.Height/2-lable1.Height/2;

lable1.Location=newPoint(gLeft,gTop);

 

二、动态创建控件并找到或者删除控件

1、以Lable为例创建控件:

Labellbl=newLabel();

lbl.Name="lblNum"+m;

lbl.AutoSize=true;

lbl.BackColor=System.Drawing.Color.Transparent;

lbl.Font=newSystem.Drawing.Font("宋体",36F,System.Drawing.FontStyle.Bold,System.Drawing.GraphicsUnit.Point,((byte)(134)));

lbl.ForeColor=System.Drawing.Color.White;

lbl.Location=newSystem.Drawing.Point(lable1.Location.X-150,29);

lbl.TextAlign=System.Drawing.ContentAlignment.TopCenter;

lbl.Anchor=System.Windows.Forms.AnchorStyles.Top;//this.Controls.Add(lbl);

窗体中添加控件this.groupBox2.Controls.Add(lbl);    //groupBox2中添加控件

2、以Lable为例删除控件:

 

if(this.groupBox2.Controls.ContainsKey("lable2")==true)

{

  this.groupBox2.Controls.RemoveByKey("lable2");

}

 

3、找到控件并对其赋值

Control[]control=this.Controls.Find("lable1",true);

if(control.Length==1&&control[0]isLabel)

{

  (control[0]asLabel).Text=“hello”;

}

                              第二部分  组件事件的动态添加

  通常在写程序的时候,当要用到某些组件,采用的方法一般都是动态创建,用完以后就释放掉。Visual C#在程序运行的时候也可以动态创建组件,下面就结合一个程序例子来具体介绍如何用Visual C#动态生成组件。首先让我们了解一下,在动态创建组件的过程中要用到的一些概论和理论。

  一. Boxing (装箱)和Unboxing (出箱):

  在用Visual C#动态创建组件的时候,要涉及到二种数据类型变量的转换,这二种类型变量就是实值类型(Value Type)变量和参考类型(Reference Type)变量,而这种转换过程在Visual C#中被称为Boxing (装箱)和Unboxing (出箱)。其中把实值类型变量转换成参考类型变量就是Boxing (装箱);把参考类型变量转换成实值类型变量就是Unboxing (出箱)。那么什么是实值类型,说的简单些,就是我们平常使用的整型、布尔型、枚举型等,这些类型的变量就是实值类型变量了;所谓参考类型,在Visual C#中指的就是Object、Class、Interface、Delegate、String、Array等,他和实值类型最主要的不同之处就是,参考类型变量存放的是指向实体对象的指针,而实值类型变量却是实实在在地实体对象。在本文介绍的程序中,主要涉及的是出箱。具体的处理方法,在下面有着具体介绍。

 

  二. 程序设计中的关键步骤以及解决方法:

  文中软件主要功能是用通过窗体上的二个按钮来创建二个不同类型的WinForm组件--Button组件和TextBox组件,并在创建的同时为每一个组件的属性赋值,给每一个创建的组件也创建了事件。

  (1).如何在窗体上创建Button组件:

  其实用Visual C#创建一个组件是十分方便的,只用下列二行语句就可以完成了:

 

Button myButton = new Button ( ) ;//创建一个新的Button组件

this.Controls.Add ( myButton ) ;  //在窗体中显示此按钮

但此时创建的这个Button组件没有任何属性,并且也没有任何事件,在本文中介绍的程序中创建的Button组件,不仅有属性也有事件,下列语句就是本文程序创建Button组件源代码:

 

counter += 1 ;             //按钮数量计算器在每次按钮按动后加 "1 "

locY += this.btnAdd.Height + 3 ;    //对要产生的按钮的纵坐标的相对位置是前一个产生按钮的相对位置的纵坐标加 "3 "

Button myButton = new Button ( ) ;   //创建一个新的Button组件

myButton.Name = "Button " + counter ;//设定他的名称和Text属性,以及产生的相对位置

myButton.Text = "按钮 " + counter ;

myButton.Location = new Point ( btnAdd.Location.X , locY ) ;

//为产生的新的Button组件设定事件,本文中为产生的按钮设定了三个事件

myButton.MouseEnter += new System.EventHandler ( this.btn_MouseEnter ) ;

myButton.MouseLeave += new System.EventHandler ( this.btn_MouseLeave ) ;

myButton.Click += new System.EventHandler ( this.btn_Click ) ;

//在窗体中显示此按钮

this.Controls.Add ( myButton ) ;

  程序不仅为每一个组件的属性都赋值,而且为每一个组件都创建了三个事件。细心的读者可能已经注意到,程序为每一个组件创建的事件的名称都是一样的。这样就有一个问题,如何在这一样的事件中,识别到底是哪个Button组件触发了事件。

 

(2).确定是哪个组件触发了事件:

  由于程序中为每一个创建的Button组件的事件都是一样的,要想正确处理这些组件的事件,就需要在事件触发的程序中判断到底是哪个组件触发了这个事件。这就需要用到上面所提出的装箱和出箱。我们知道Sender对象是一个参考类型变量,他存放的是指向触发当前事件实体对象的指针。要把他给转换成实值对象类型,通过下列语句就可以确定是哪个组件触发了当前事件, 其他事件可以仿照此事件的处理过程来处理。

private void btn_MouseEnter ( object sender , System.EventArgs e )

{

  Button currentButton = ( Button ) sender ;//出箱

  currentButton.BackColor = Color.Red ;//设定按钮的背景色

}

 

(3). 如何在窗体上创建TextBox组件:

  创建TextBox组件的过程和创建Button组件过程相类似,只是在创建的组件类型上面有一点区别,具体实现语句如下:

counter01 += 1 ;                    //文本框数量计算器在每次按钮按动后加 "1 "

locY1 += this.txtAdd.Height + 3 ;            //对要产生的文本框的纵坐标的相对位置是前一个产生按钮的相对位置的纵坐标加 "3

TextBox myBox = new TextBox ( ) ;            //创建一个新的TextBox组件

myBox.Name = "TextBox " + counter01 ;        //设定他的名称和Text属性,以及产生的位置

myBox.Text = "文本框 " + counter01 ;

myBox.Location = new Point ( txtAdd.Location.X , locY1 ) ;

myBox.Click += new System.EventHandler ( this.btn_Click ) ;      //为产生的新的TextBox组件设定事件,本文中为产生的文本框设定了一个事件

this.Controls.Add ( myBox ) ;                        //在窗体中显示此文本框

  此时细心的读者又会发现,为每一个TextBox组件创建Click事件和为Button组件创建的Click事件也是一样的,这样在Click事件中不仅要判断是哪个组件触发了事件,还要判断是那种类型的组件触发了事件,下面语句是实现这些判断地具体方法:

private void btn_Click ( object sender , System.EventArgs e )

{

   if ( sender.GetType ( ) == typeof ( Button ) )

   {

     Button control = ( Button ) sender ;

     MessageBox.Show ( control.Text + "被按动了! ");

   }

   else

   {

     TextBox control = ( TextBox ) sender ;

     MessageBox.Show ( control.Text + "被按动了! " ) ;

   }

}

  当然如果你也可以单独为TextBox组件创建Click事件。此时创建的事件语句可改为:

myBox.Click += new System.EventHandler ( this.txt _Click ) ;

 

下面是实现txt _Click ( )事件的程序代码:

private void txt_Click ( object sender , System.EventArgs e )

{

 TextBox currentButton = ( TextBox ) sender ;

 MessageBox.Show ( currentButton.Text + "被按动了! ");

}

 

 

三、 总结:

  通过上面介绍,不难看出,动态创建组件并不是一件很难的事情,难就难在为这个组件创建事件上面,因为这涉及到实值类型变量和参考类型变量的转换,这就是所谓的装箱和出箱的问题。当然在程序设计的时候,你不仅可以创建那些可见的组件,也可以创建那些不可见的组件,具体的实现方法和本文中的方法类似。

 

 

 

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。



    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/3478019.html,如需转载请自行联系原作者


相关文章
|
3月前
|
数据采集 存储 C#
C# 爬虫技术:京东视频内容抓取的实战案例分析
C# 爬虫技术:京东视频内容抓取的实战案例分析
|
2月前
|
SQL API 定位技术
基于C#使用winform技术的游戏平台的实现【C#课程设计】
本文介绍了基于C#使用WinForms技术开发的游戏平台项目,包括项目结构、运行截图、实现功能、部分代码说明、数据库设计和完整代码资源。项目涵盖了登录注册、个人信息修改、游戏商城列表查看、游戏管理、用户信息管理、数据分析等功能。代码示例包括ListView和ImageList的使用、图片上传、图表插件使用和SQL工具类封装,以及高德地图天气API的调用。
基于C#使用winform技术的游戏平台的实现【C#课程设计】
|
27天前
|
人工智能 开发框架 C#
C#/.NET/.NET Core技术前沿周刊 | 第 6 期(2024年9.16-9.22)
C#/.NET/.NET Core技术前沿周刊 | 第 6 期(2024年9.16-9.22)
|
27天前
|
人工智能 开发框架 Cloud Native
C#/.NET/.NET Core技术前沿周刊 | 第 9 期(2024年10.07-10.13)
C#/.NET/.NET Core技术前沿周刊 | 第 9 期(2024年10.07-10.13)
|
1月前
|
存储 安全 算法
C#一分钟浅谈:数据加密与解密技术
【10月更文挑战第3天】在数字化时代,信息安全至关重要。数据加密作为保障信息不被未授权访问的有效手段,通过特定算法将明文转换为密文,确保即使数据被截获也难以解读。本文从基础概念入手,介绍C#中实现数据加密的方法,涵盖对称加密(如AES、DES)与非对称加密(如RSA),并通过具体示例代码演示如何使用`System.Security.Cryptography.Aes`类完成AES加密和解密过程。此外,还强调了密钥管理及安全策略的重要性。
42 4
|
1月前
|
负载均衡 网络协议 C#
C#实现WebSocket实时消息推送技术详解
C#实现WebSocket实时消息推送技术详解
35 1
|
27天前
|
数据可视化 NoSQL C#
C#/.NET/.NET Core技术前沿周刊 | 第 8 期(2024年10.01-10.06)
C#/.NET/.NET Core技术前沿周刊 | 第 8 期(2024年10.01-10.06)
|
27天前
|
设计模式 开发框架 C#
C#/.NET/.NET Core技术前沿周刊 | 第 4 期(2024年9.1-9.8)
C#/.NET/.NET Core技术前沿周刊 | 第 4 期(2024年9.1-9.8)
|
2月前
|
人工智能 开发框架 算法
C#/.NET/.NET Core技术前沿周刊 | 第 2 期(2024年8.19-8.25)
C#/.NET/.NET Core技术前沿周刊 | 第 2 期(2024年8.19-8.25)
|
2月前
|
传感器 应用服务中间件 Linux
C#/.NET/.NET Core技术前沿周刊 | 第 3 期(2024年8.26-8.31)
C#/.NET/.NET Core技术前沿周刊 | 第 3 期(2024年8.26-8.31)