当前位置: 首页 > 编程日记 > 正文

创建ASP.NET WEB自定义控件——例程2

本文通过一段完整的代码向读者介绍复合自定义控件的制作,包括:自定义属性、事件处理、控件间数据传递等方面的技术。

作者在http://damao.0538.org有一些控件和代码,并在更新中,有兴趣的读者可以去下载。

以下是一个登陆框的代码,包括:用户名输入TextBox、密码输入TextBox、提交Button、重置Button以及承载以上四项的Panel。控件类名为LoginCtrl。

(例程使用C#)

using System;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.ComponentModel;

using System.Drawing;

namespace TestLib

{

[DefaultProperty("BackColor"),

ToolboxData("<{0}:LoginCtrl runat=server></{0}:LoginCtrl>")]

public class LoginCtrl : System.Web.UI.WebControls.WebControl

{

private Color _fontColor = Color.Black;//声明字体颜色变量

private Color _backColor = Color.White;//声明控件背景变量

首先声明要在复合控件中使用的子控件。

private Label lblUserName = new Label();//显示“用户名”的Label控件

private Label lblPassWord = new Label();//显示“密码”的Label控件

private TextBox txtUserName = new TextBox();//用户名输入的TextBox控件

private TextBox txtPassWord = new TextBox();//密码输入的TextBox控件

private Button submitButton = new Button();//提交Button控件

private Button clearButton = new Button();//重置Button控件

private System.Web.UI.WebControls.Panel pnlFrame = new System.Web.UI.WebControls.Panel();//承载其它控件的容器Panel控件

当然要在符合控件中使用的事件一定要声明的,它们会出现在属性框的事件栏里。

public event EventHandler SubmitOnClick;//声明自定义控件LoginCtrl的提交事件

public event EventHandler ClearOnClick;//声明自定义控件LoginCtrl的重置事件

public LoginCtrl()

{

刚刚声明的子控件和事件要在这里进行初始化处理。

//初始化控件的属性

this.lblUserName.Text = "用户名:";

this.lblPassWord.Text = "密 码:";

this.txtPassWord.TextMode = System.Web.UI.WebControls.TextBoxMode.Password;

this.pnlFrame.Width = 240;

this.pnlFrame.Height = 120;

this.pnlFrame.BackColor = Color.Empty;

//添加提交按钮点击事件

submitButton.Text = "确定";

submitButton.Click += new EventHandler(this.SubmitBtn_Click);

//添加重置按钮点击事件

clearButton.Text = "重置";

clearButton.Click += new EventHandler(this.ClearBtn_Click);

//将声明的各子控件添加到LoginCtrl中

this.Controls.Add(this.submitButton);

this.Controls.Add(this.clearButton);

this.Controls.Add(this.txtUserName);

this.Controls.Add(this.txtPassWord);

this.Controls.Add(this.lblUserName);

this.Controls.Add(this.lblPassWord);

this.Controls.Add(this.pnlFrame);

}

根据自己的需要添加或重载符合控件的公共属性

//字体颜色属性

[Bindable(false),

Category("Appearance"),

DefaultValue("")]

public override Color ForeColor

{

get

{

return this._fontColor;

}

set

{

this._fontColor = value;

}

}

//控件背景属性

[Bindable(false),

Category("Appearance"),

DefaultValue("")]

public override Color BackColor

{

get

{

return this._backColor;

}

set

{

this._backColor = value;

}

}

//用户名属性

[Bindable(false),

Category("Appearance"),

DefaultValue("")]

public string UserName

{

get

{

return this.txtUserName.Text;

}

set

{

this.txtUserName.Text = value;

}

}

//密码属性

[Bindable(false),

Category("Appearance"),

DefaultValue(""), Browsable(false)]

public string PassWord

{

get

{

return this.txtPassWord.Text;

}

set

{

this.txtPassWord.Text = value;

}

}

//控件宽度属性

[Bindable(false),

Category("Appearance"),

DefaultValue("")]

public override Unit Width

{

get

{

return this.pnlFrame.Width;

}

set

{

this.pnlFrame.Width = value;

}

}

//控件高度属性

[Bindable(false),

Category("Appearance"),

DefaultValue("")]

public override Unit Height

{

get

{

return this.pnlFrame.Height;

}

set

{

this.pnlFrame.Height = value;

}

}

//控件边框颜色属性

[Bindable(false),

Category("Appearance"),

DefaultValue("")]

public override Color BorderColor

{

get

{

return this.pnlFrame.BorderColor;

}

set

{

this.pnlFrame.BorderColor = value;

}

}

//控件边框样式属性

[Bindable(false),

Category("Appearance"),

DefaultValue("")]

public override BorderStyle BorderStyle

{

get

{

return this.pnlFrame.BorderStyle;

}

set

{

this.pnlFrame.BorderStyle = value;

}

}

//控件边框宽度属性

[Bindable(false),

Category("Appearance"),

DefaultValue("")]

public override Unit BorderWidth

{

get

{

return this.pnlFrame.BorderWidth;

}

set

{

this.pnlFrame.BorderWidth = value;

}

}

下面要把控件输出出去,展示在页面上。

/// <summary>

/// 将此控件呈现给指定的输出参数。

/// </summary>

/// <param name="output"> 要写出到的 HTML 编写器 </param>

protected override void Render(HtmlTextWriter output)

{

this.pnlFrame.RenderBeginTag(output);//输出Panel控件

//在Panel中绘制表格

output.AddAttribute(HtmlTextWriterAttribute.Border,"0");

output.AddAttribute(HtmlTextWriterAttribute.Cellpadding,"0");

output.AddAttribute(HtmlTextWriterAttribute.Cellspacing,"0");

output.AddAttribute(System.Web.UI.HtmlTextWriterAttribute.Width,"100%");

output.AddAttribute(System.Web.UI.HtmlTextWriterAttribute.Height,"100%");

output.AddAttribute(HtmlTextWriterAttribute.Bgcolor,this._backColor.Name);

output.RenderBeginTag(HtmlTextWriterTag.Table);

output.RenderBeginTag(HtmlTextWriterTag.Tr);

output.RenderBeginTag(HtmlTextWriterTag.Td);

//在表格中添加Label控件

this.lblUserName.ForeColor = this._fontColor;

this.lblUserName.RenderControl(output);

output.RenderEndTag();

output.RenderBeginTag(HtmlTextWriterTag.Td);

//在表格中添加TextBox控件

this.txtUserName.RenderControl(output);

output.RenderEndTag();

output.RenderEndTag();

output.RenderBeginTag(HtmlTextWriterTag.Tr);

output.RenderBeginTag(HtmlTextWriterTag.Td);

//在表格中添加Label控件

this.lblPassWord.ForeColor = this._fontColor;

this.lblPassWord.RenderControl(output);

output.RenderEndTag();

output.RenderBeginTag(HtmlTextWriterTag.Td);

//在表格中添加TextBox控件

this.txtPassWord.RenderControl(output);

output.RenderEndTag();

output.RenderEndTag();

output.RenderBeginTag(HtmlTextWriterTag.Tr);

output.AddAttribute(HtmlTextWriterAttribute.Align,"right");

output.RenderBeginTag(HtmlTextWriterTag.Td);

//在表格中添加Button控件

this.submitButton.RenderControl(output);

output.RenderEndTag();

output.AddAttribute(HtmlTextWriterAttribute.Align,"center");

output.RenderBeginTag(HtmlTextWriterTag.Td);

//在表格中添加Button控件

this.clearButton.RenderControl(output);

output.RenderEndTag();

output.RenderEndTag();

output.RenderEndTag();

this.pnlFrame.RenderEndTag(output);

}

当按钮点击时怎么做呢?这是个事件冒泡。

//处理提交按钮点击事件

private void SubmitBtn_Click(object sender, EventArgs e)

{

EventArgs e1 = new EventArgs();

if(this.SubmitOnClick!=null)

this.SubmitOnClick(this.submitButton,e1);

}

//处理重置按钮点击事件

private void ClearBtn_Click(object sender, EventArgs e)

{

this.txtPassWord.Text = "";

this.txtUserName.Text = "";

EventArgs e1 = new EventArgs();

if(this.ClearOnClick!=null)

this.ClearOnClick(this.clearButton,e1);

}

}

}

编译一下,OK!

这个控件没有什么实际的使用价值,本文制作这个例子是为了向读者展示复合控件的制作方法,也很简单,是吧?

转载于:https://www.cnblogs.com/gjcn/archive/2006/05/29/412005.html

相关文章:

Oracle可变数组实例说明

创建类型comm_info CREATE TYPE comm_info AS OBJECT ( /*此类型为通讯方式的集合*/ no number(3), /*通讯类型号*/ comm_type varchar2(20), /*通讯类型*/ comm_no varchar2(30)); /*号码*/ 创建可变数组comm_info_list CREATE TYPE comm_info_list AS VARRAY(50) OF com…

lua创建文件和文件夹

创建文件夹&#xff1a; os.execute(mkdir xx) 创建文件&#xff1a; f assert(io.open(a.tmp,w)) f:write(test) f:close() 转载于:https://www.cnblogs.com/cyberwalker/p/3599199.html

从定制软件到通用软件的转变

最近做了个项目&#xff0c;在不到一周的时间内完成一个大型网站的外壳&#xff0c;这是个很令人振奋的消息~&#xff01;我却走了许多弯路&#xff0c;本来公司有自己的信息平台&#xff0c;从信息平台衍生出来的成型的系统也有四五个其实都是工具的拼装&#xff0c;而我做的部…

OPENVAS运行

https://www.jianshu.com/p/382546aaaab5

白盒测试的5种逻辑覆盖法

文章目录判定覆盖法 Decision Coverage (DC)条件覆盖 Condition Coverage (CC)判定-条件覆盖 Condition-Decision Coverage条件组合覆盖 Multiple Condition Coverage (MCC)修正的条件/判定覆盖 Modified Condition/Decision Coverage (MC/DC)5种覆盖的关系判定覆盖法 Decision…

[sinatra] Just Do It: Learn Sinatra, Part One Darren Jones

1. Install sinatra gem gem install sinatra --no-ri --no-rdoc2. Basic App #!/usr/bin/ruby require sinatra get / do"Just Do It" endruby低于1.9,需要在文件开头加require rubygems ruby basic.rbOpen up your browser and go to http://localhost:4567. 3. I…

GMTC 大前端时代前端监控的最佳实践

摘要&#xff1a; 今天我分享的内容分成三个部分&#xff1a; 第一部分是“大前端时代前端监控新的变化”, 讲述这些年来&#xff0c;前端监控一些新的视角以及最前沿的一些思考。 第二部分"前端监控的最佳实践"&#xff0c; 从使用的角度出发&#xff0c;介绍前端监…

Visual C#访问接口

对接口成员的访问 对接口方法的调用和采用索引指示器访问的规则与类中的情况也是相同的。如果底层成员的命名与继承而来的高层成员一致&#xff0c;那么底层成员将覆盖同名的高层成员。但由于接口支持多继承&#xff0c;在多继承中&#xff0c;如果两个父接口含有同名的成员&am…

powerdesigner类图在子类中显示从父类继承来的方法

首先确保画了子类和父类之间的继承线 然后在子类的选项卡中点击

[UML]UML系列——用例图中的各种关系(include、extend)

[UML]UML系列——用例图中的各种关系&#xff08;include、extend&#xff09; 原文:[UML]UML系列——用例图中的各种关系&#xff08;include、extend&#xff09;用例图中的各种关系 一、参与者与用例间的关联关系 参与者与用例之间的通信&#xff0c;也成为关联或通信关系。…

熬夜写了一个小游戏,向SpaceX聊表敬意

2019独角兽企业重金招聘Python工程师标准>>> 这是我长久放在桌面上的一张图片。 这张照片的名字叫做 Pale Blue Dot&#xff08;暗淡蓝点&#xff09;&#xff0c;是旅行者1号在距地球64亿公里回望太阳系时所拍下的。照片右侧中部有一个隐约可见的小蓝点&#xff0c…

【转】Linux Oracle服务启动停止脚本与开机自启动

在CentOS 6.3下安装完Oracle 10g R2&#xff0c;重开机之后&#xff0c;你会发现Oracle没有自行启动&#xff0c;这是正常的&#xff0c;因为在Linux下安装Oracle的确不会自行启动&#xff0c;必须要自行设置相关参数&#xff0c;首先先介绍一般而言如何启动oracle。 一、在Lin…

ASP.Net中MD5加密-16位32位

publicstringmd5(stringstr,intcode){if(code16) //16位MD5加密&#xff08;取32位加密的9~25字符&#xff09;{return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str,"MD5").ToLower().Substring(8,16) ;} else//32位加密{retur…

PL/SQL编程:将两个数进行交换的存储过程

创建过程exchangeTwo 调用过程enchangeTwo

WCF之多个终结点

1.服务端配置如下&#xff08;一个Service节点下可有多个endpoint,&#xff09;&#xff1a; 1 1<system.serviceModel>2 2 <services>3 3 <service name"Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration"returnFaul…

YAML 语言入门教程

2019独角兽企业重金招聘Python工程师标准>>> YAML简介 另一种标记语言&#xff08;Yet Another Markup Language&#xff09; YAML&#xff08;英语发音&#xff1a;/ˈjməl/&#xff0c;尾音类似camel骆驼&#xff09;是一个可读性高&#xff0c;用来表达资料序列…

我翻译的一篇文章,OO设计中对象的创建和使用

OO设计中对象的创建和使用 转载于:https://www.cnblogs.com/lishu1980/archive/2006/06/22/432526.html

SQL Server Profiler工具

SQL Server Profiler工具 原文:SQL Server Profiler工具一、SQL Profiler工具简介 SQL Profiler是一个图形界面和一组系统存储过程&#xff0c;其作用如下&#xff1a; 图形化监视SQL Server查询&#xff1b;在后台收集查询信息&#xff1b;分析性能&#xff1b;诊断像死锁之类…

Nginx—核心配置location匹配规则说明

2019独角兽企业重金招聘Python工程师标准>>> location介绍 location指令是Nginx中最核心的一项配置&#xff0c;根据预先定义的URL匹配规则来接收用户发送的请求&#xff0c;根据匹配结果&#xff0c;将请求转发到后台服务器、非法的请求直接拒绝并返回403&#xff…

Windows Live Messenger  正式版已经发布

Windows Live Messenger 正式版已经发布!这是新一代的 Messenger。它拥有全新的名字&#xff0c;可以免费下载。并且除了延续使用原 Messenger 的全部功能外&#xff0c;它还提供了几种出色的全新交流方式&#xff0c;实现与朋友的即时共享和交流。转载于:https://www.cnblogs.…

关闭ubuntu启动时System Program Problem Detected提示

修改vi /etc/default/apport 将其值设置1-->0转载于:https://www.cnblogs.com/snail-micheal/p/3607969.html

C++开源跨平台类库集

在如下的库支持下&#xff0c;开发的系统可以很方便移植到当前大部分平台上运行而无需改动&#xff0c;只需在对应的平台下 用你喜欢的编译器 重新编译即可 经典的C库 STLport-------SGI STL库的跨平台可移植版本&#xff0c;在以前有些编译器离符合 标准比较远的情况…

僵尸进程和孤儿进程

一 . 僵尸进程: 子进程退出&#xff0c;父进程没有回收子进程资源&#xff08;PCB&#xff09;&#xff0c;则子进程变成僵尸进程 处理僵尸进程的方法&#xff1a;wait 和 waitpid 调用wait和waitpid不仅可以获得子进程的终止信息&#xff0c;还可以使父进程阻塞等待子进程终止…

Castle ActiveRecord(一)概述

一、ActiveRecord与Castle ActiveRecordActiveRecord是《Patterns of Enterprise Application Architecture》中描述的著名模式。基本上&#xff0c;当实例每一行的时候&#xff0c;所有的静态方法会作用于全部纪录。 Castle ActiveRecord 是ActiveRecord 模式的一个实现&am…

一步步学习SPD2010--第十一章节--处理母版页(8)--从母版页创建网页

一步步学习SPD2010--第十一章节--处理母版页&#xff08;8&#xff09;--从母版页创建网页 在SPD中&#xff0c;你可以使用许多不同的方法创建ASP.NET页面。然而&#xff0c;因为页面将是SP网站的一部分&#xff0c;你很可能想像其他页面一样&#xff0c;保持相同的导航元素和外…

Confluence 6 查看空间活动

空间活动信息是默认禁用&#xff08;disabled by default&#xff09;的。活动&#xff08;Activity&#xff09;的标没有显示&#xff0c;如果你的 Confluence Usage Stats 插件没有启用的。请查看下面的说明&#xff1a; 如果启用的话&#xff0c;空间活动界面显示了每一个空…