.net为大家提供了各种各样的控件,也足够的丰富多彩。但是有时候你是不是想开发一些自己的控件以提高开发效率,或者实现一些特殊的功能呢。
下面我讲述一下,建立一个最基本的web复合控件的过程。
首先新建一个C#类库项目,取名叫MyControl吧。删除默认的类文件class1,然后建立我们自己的类文件MyControl.cs。
现在我们向其中添加密码。
在刚生成的代码上先把它修改成这样子
我们将使用以下引用:
案例1
using System;
using System.IO;
using System.Drawing;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
保证我们的MyContro是从WebControl继承的。
public class MyControl:WebControl
下面我们将重写下面两个函数,这都是必须的
protected override void Render(HtmlTextWriter writer)
protected override void CreateChildControls()
修改第一个函数为下面代码
protected override void Render(HtmlTextWriter writer)
{
this.CreateChildControls();
base.Render (writer);
}
修改第二个函数为下面代码
protected override void CreateChildControls()
{
// 清除现有的子控件及其 ViewState
this.Controls.Clear();
this.ClearChildViewState();
// 生成控件树
// 生成环境表格(一行,两个单元格)
Table myTable = new Table();
//build the table row生成表格中的行
TableRow row = new TableRow();
myTable.Rows.Add(row);
// 生成单元格
TableCell myCell = new TableCell();
//用来生成链接按钮导航条的代码。每个按钮都显示有一个 Webdings 字符,可以根据需//禁用,并被绑定到内部的 Click 事件处理程序。
LinkButton myLinkButton = new LinkButton();
myLinkButton.ID = "MyLinkButton";
myLinkButton.Click = new EventHandler(myLinkButton_Click);
myLinkButton.Font.Name = "宋体";
myLinkButton.ToolTip = "好玄啊!";
myLinkButton.Text = "请点我";
myCell.Controls.Add(myLinkButton);
row.Cells.Add(myCell);
Controls.Add(t);
}
下面写你自己的事件的方法吧
private void myLinkButton_Click(object sender,System.EventArgs e)
{
Page.Response.Write("想干点什么就写点什么吧,就这么简单!");
}
下面编译一下吧,然后点工具—》添加/移除工具箱项
然后浏览到你编译生成的dll,现在在工具箱里你看到了什么?
把myControl拖到你自己的webForm上看看效果吧。
OK,就这么简单。
好了,时间不多就先写到这里吧。
我们以后将继续讨论这个自定义控件的扩展。不过聪明的你也应该能扩展出很多功能来了吧。
案例2
另一个两个文本框,两个验证控件,一个按钮的复合控件
using System;
using System.ComponentModel;
using System.Drawing;
using System.Security.Permissions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebControlLibrary
{
[
DefaultProperty("ButtonText"),
ToolboxData("<{0}:Register runat=/"server/"> </{0}:Register>"),
]
public class Register : CompositeControl
{
// 定义私有字段
private Button submitButton;
private TextBox nameTextBox;
private Label nameLabel;
private TextBox emailTextBox;
private Label emailLabel;
private RequiredFieldValidator emailValidator;
private RequiredFieldValidator nameValidator;
// 实现属性ButtonText
[
Bindable(true),
Category("Appearance"),
DefaultValue("按钮"),
Description("按钮上的文字内容.")
]
public string ButtonText
{
get
{
EnsureChildControls();
return submitButton.Text;
}
set
{
EnsureChildControls();
submitButton.Text = value;
}
}
// 实现属性Name
[
Bindable(true),
Category("Default"),
DefaultValue("用户名"),
Description("用户名.")
]
public string Name
{
get
{
EnsureChildControls();
return nameTextBox.Text;
}
set
{
EnsureChildControls();
nameTextBox.Text = value;
}
}
// 实现属性NameErrorMessage
[
Bindable(true),
Category("Appearance"),
DefaultValue("用户名错误"),
Description("用户名验证错误信息.")
]
public string NameErrorMessage
{
get
{
EnsureChildControls();
return nameValidator.ErrorMessage;
}
set
{
EnsureChildControls();
nameValidator.ErrorMessage = value;
nameValidator.ToolTip = value;
}
}
// 实现属性NameLabelText
[
Bindable(true),
Category("Appearance"),
DefaultValue("用户名"),
Description("用户名文本框旁的文字.")
]
public string NameLabelText
{
get
{
EnsureChildControls();
return nameLabel.Text;
}
set
{
EnsureChildControls();
nameLabel.Text = value;
}
}
// 实现属性Email
[
Bindable(true),
Category("Default"),
DefaultValue("邮件地址"),
Description("邮件地址.")
]
public string Email
{
get
{
EnsureChildControls();
return emailTextBox.Text;
}
set
{
EnsureChildControls();
emailTextBox.Text = value;
}
}
// 实现属性EmailErrorMessage
[
Bindable(true),
Category("Appearance"),
DefaultValue("邮件地址错误"),
Description("邮件地址验证错误信息.")
]
public string EmailErrorMessage
{
get
{
EnsureChildControls();
return emailValidator.ErrorMessage;
}
set
{
EnsureChildControls();
emailValidator.ErrorMessage = value;
emailValidator.ToolTip = value;
}
}
// 实现属性EmailLabelText
[
Bindable(true),
Category("Appearance"),
DefaultValue("电子邮件"),
Description("电子邮件文本框旁的文字.")
]
public string EmailLabelText
{
get
{
EnsureChildControls();
return emailLabel.Text;
}
set
{
EnsureChildControls();
emailLabel.Text = value;
}
}
// 重写ICompositeControlDesignerAccessor接口的RecreateChildContrls方法
protected override void RecreateChildControls()
{
EnsureChildControls();
}
// 重写Control基类的CreateChildControls方法
protected override void CreateChildControls()
{
// 清除所有子控件
//private Button submitButton;
//private TextBox nameTextBox;
//private Label nameLabel;
//private TextBox emailTextBox;
//private Label emailLabel;
//private RequiredFieldValidator emailValidator;
//private RequiredFieldValidator nameValidator;
Controls.Clear();
nameLabel = new Label();
nameTextBox = new TextBox();
nameTextBox.ID = "nameTextBox";
nameValidator = new RequiredFieldValidator();
nameValidator.ID = "validator1";
nameValidator.ControlToValidate = nameTextBox.ID;
nameValidator.Text = NameErrorMessage;
nameValidator.Display = ValidatorDisplay.Static;
emailLabel = new Label();
emailTextBox = new TextBox();
emailTextBox.ID = "emailTextBox";
emailValidator = new RequiredFieldValidator();
emailValidator.ID = "validator2";
emailValidator.ControlToValidate = emailTextBox.ID;
emailValidator.Text = EmailErrorMessage;
emailValidator.Display = ValidatorDisplay.Static;
submitButton = new Button();
submitButton.ID = "button1";
this.Controls.Add(nameLabel);
this.Controls.Add(nameTextBox);
this.Controls.Add(nameValidator);
this.Controls.Add(emailLabel);
this.Controls.Add(emailTextBox);
this.Controls.Add(emailValidator);
this.Controls.Add(submitButton);
}
// 重写Render方法
protected override void Render(HtmlTextWriter writer)
{
AddAttributesToRender(writer);
writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "1", false);
writer.RenderBeginTag(HtmlTextWriterTag.Table);
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
nameLabel.RenderControl(writer);
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Td);
nameTextBox.RenderControl(writer);
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Td);
nameValidator.RenderControl(writer);
writer.RenderEndTag();
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
emailLabel.RenderControl(writer);
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Td);
emailTextBox.RenderControl(writer);
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Td);
emailValidator.RenderControl(writer);
writer.RenderEndTag();
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2", false);
writer.AddAttribute(HtmlTextWriterAttribute.Align, "right", false);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
submitButton.RenderControl(writer);
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write(" laolaolaolao");
writer.RenderEndTag();
writer.RenderEndTag();
writer.RenderEndTag();
}
}
}
下面我讲述一下,建立一个最基本的web复合控件的过程。
首先新建一个C#类库项目,取名叫MyControl吧。删除默认的类文件class1,然后建立我们自己的类文件MyControl.cs。
现在我们向其中添加密码。
在刚生成的代码上先把它修改成这样子
我们将使用以下引用:
案例1
using System;
using System.IO;
using System.Drawing;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
保证我们的MyContro是从WebControl继承的。
public class MyControl:WebControl
下面我们将重写下面两个函数,这都是必须的
protected override void Render(HtmlTextWriter writer)
protected override void CreateChildControls()
修改第一个函数为下面代码
protected override void Render(HtmlTextWriter writer)
{
this.CreateChildControls();
base.Render (writer);
}
修改第二个函数为下面代码
protected override void CreateChildControls()
{
// 清除现有的子控件及其 ViewState
this.Controls.Clear();
this.ClearChildViewState();
// 生成控件树
// 生成环境表格(一行,两个单元格)
Table myTable = new Table();
//build the table row生成表格中的行
TableRow row = new TableRow();
myTable.Rows.Add(row);
// 生成单元格
TableCell myCell = new TableCell();
//用来生成链接按钮导航条的代码。每个按钮都显示有一个 Webdings 字符,可以根据需//禁用,并被绑定到内部的 Click 事件处理程序。
LinkButton myLinkButton = new LinkButton();
myLinkButton.ID = "MyLinkButton";
myLinkButton.Click = new EventHandler(myLinkButton_Click);
myLinkButton.Font.Name = "宋体";
myLinkButton.ToolTip = "好玄啊!";
myLinkButton.Text = "请点我";
myCell.Controls.Add(myLinkButton);
row.Cells.Add(myCell);
Controls.Add(t);
}
下面写你自己的事件的方法吧
private void myLinkButton_Click(object sender,System.EventArgs e)
{
Page.Response.Write("想干点什么就写点什么吧,就这么简单!");
}
下面编译一下吧,然后点工具—》添加/移除工具箱项
然后浏览到你编译生成的dll,现在在工具箱里你看到了什么?
把myControl拖到你自己的webForm上看看效果吧。
OK,就这么简单。
好了,时间不多就先写到这里吧。
我们以后将继续讨论这个自定义控件的扩展。不过聪明的你也应该能扩展出很多功能来了吧。
案例2
另一个两个文本框,两个验证控件,一个按钮的复合控件
using System;
using System.ComponentModel;
using System.Drawing;
using System.Security.Permissions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebControlLibrary
{
[
DefaultProperty("ButtonText"),
ToolboxData("<{0}:Register runat=/"server/"> </{0}:Register>"),
]
public class Register : CompositeControl
{
// 定义私有字段
private Button submitButton;
private TextBox nameTextBox;
private Label nameLabel;
private TextBox emailTextBox;
private Label emailLabel;
private RequiredFieldValidator emailValidator;
private RequiredFieldValidator nameValidator;
// 实现属性ButtonText
[
Bindable(true),
Category("Appearance"),
DefaultValue("按钮"),
Description("按钮上的文字内容.")
]
public string ButtonText
{
get
{
EnsureChildControls();
return submitButton.Text;
}
set
{
EnsureChildControls();
submitButton.Text = value;
}
}
// 实现属性Name
[
Bindable(true),
Category("Default"),
DefaultValue("用户名"),
Description("用户名.")
]
public string Name
{
get
{
EnsureChildControls();
return nameTextBox.Text;
}
set
{
EnsureChildControls();
nameTextBox.Text = value;
}
}
// 实现属性NameErrorMessage
[
Bindable(true),
Category("Appearance"),
DefaultValue("用户名错误"),
Description("用户名验证错误信息.")
]
public string NameErrorMessage
{
get
{
EnsureChildControls();
return nameValidator.ErrorMessage;
}
set
{
EnsureChildControls();
nameValidator.ErrorMessage = value;
nameValidator.ToolTip = value;
}
}
// 实现属性NameLabelText
[
Bindable(true),
Category("Appearance"),
DefaultValue("用户名"),
Description("用户名文本框旁的文字.")
]
public string NameLabelText
{
get
{
EnsureChildControls();
return nameLabel.Text;
}
set
{
EnsureChildControls();
nameLabel.Text = value;
}
}
// 实现属性Email
[
Bindable(true),
Category("Default"),
DefaultValue("邮件地址"),
Description("邮件地址.")
]
public string Email
{
get
{
EnsureChildControls();
return emailTextBox.Text;
}
set
{
EnsureChildControls();
emailTextBox.Text = value;
}
}
// 实现属性EmailErrorMessage
[
Bindable(true),
Category("Appearance"),
DefaultValue("邮件地址错误"),
Description("邮件地址验证错误信息.")
]
public string EmailErrorMessage
{
get
{
EnsureChildControls();
return emailValidator.ErrorMessage;
}
set
{
EnsureChildControls();
emailValidator.ErrorMessage = value;
emailValidator.ToolTip = value;
}
}
// 实现属性EmailLabelText
[
Bindable(true),
Category("Appearance"),
DefaultValue("电子邮件"),
Description("电子邮件文本框旁的文字.")
]
public string EmailLabelText
{
get
{
EnsureChildControls();
return emailLabel.Text;
}
set
{
EnsureChildControls();
emailLabel.Text = value;
}
}
// 重写ICompositeControlDesignerAccessor接口的RecreateChildContrls方法
protected override void RecreateChildControls()
{
EnsureChildControls();
}
// 重写Control基类的CreateChildControls方法
protected override void CreateChildControls()
{
// 清除所有子控件
//private Button submitButton;
//private TextBox nameTextBox;
//private Label nameLabel;
//private TextBox emailTextBox;
//private Label emailLabel;
//private RequiredFieldValidator emailValidator;
//private RequiredFieldValidator nameValidator;
Controls.Clear();
nameLabel = new Label();
nameTextBox = new TextBox();
nameTextBox.ID = "nameTextBox";
nameValidator = new RequiredFieldValidator();
nameValidator.ID = "validator1";
nameValidator.ControlToValidate = nameTextBox.ID;
nameValidator.Text = NameErrorMessage;
nameValidator.Display = ValidatorDisplay.Static;
emailLabel = new Label();
emailTextBox = new TextBox();
emailTextBox.ID = "emailTextBox";
emailValidator = new RequiredFieldValidator();
emailValidator.ID = "validator2";
emailValidator.ControlToValidate = emailTextBox.ID;
emailValidator.Text = EmailErrorMessage;
emailValidator.Display = ValidatorDisplay.Static;
submitButton = new Button();
submitButton.ID = "button1";
this.Controls.Add(nameLabel);
this.Controls.Add(nameTextBox);
this.Controls.Add(nameValidator);
this.Controls.Add(emailLabel);
this.Controls.Add(emailTextBox);
this.Controls.Add(emailValidator);
this.Controls.Add(submitButton);
}
// 重写Render方法
protected override void Render(HtmlTextWriter writer)
{
AddAttributesToRender(writer);
writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "1", false);
writer.RenderBeginTag(HtmlTextWriterTag.Table);
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
nameLabel.RenderControl(writer);
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Td);
nameTextBox.RenderControl(writer);
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Td);
nameValidator.RenderControl(writer);
writer.RenderEndTag();
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
emailLabel.RenderControl(writer);
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Td);
emailTextBox.RenderControl(writer);
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Td);
emailValidator.RenderControl(writer);
writer.RenderEndTag();
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2", false);
writer.AddAttribute(HtmlTextWriterAttribute.Align, "right", false);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
submitButton.RenderControl(writer);
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write(" laolaolaolao");
writer.RenderEndTag();
writer.RenderEndTag();
writer.RenderEndTag();
}
}
}