ASP.NET自定义控件编程1
时间:2010-08-20 来源:Victor2008
实现一个简单的文本显示控件,作用是页面上显示一些信息,如lable
1.创建一个解决方案,里边分别建立一个Web控件库和一个网站(别忘了网站要添加应用Web控件库哦)
2.创建自定义控件类MyControl.cs,引入命名空间
......
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebControlLibrary
{
//别忘了继承自WebControl
public class MyControl : WebControl
{ }
}
3.根据我们的需求,知道我们需要一个属性用于显示信息就足够了,这里定义成Text
定义Text属性,并存在viewstate中,如果值为空则给个默认值空字符串
//自定义属性Text
public string Text
{
get
{
object obj = ViewState["Text"];
return obj == null ? string.Empty : Convert.ToString(obj);
}
set
{
ViewState["Text"] = value;
}
}
4.重写Control类上的CreateChildControls方法,用于创建控件层次,以便为回发和呈现做准备。在该方法中调用
了自定义的CreateControlHierarchy方法创建控件层次。
protected virtual void CreateControlHierarchy()
{
//创建一行一列的表格,用于控件布局
Table table = new Table();
TableRow row = new TableRow();
table.Rows.Add(row);
TableCell text = new TableCell();
//创建Text
CreateText(text);
row.Cells.Add(text);
this.Controls.Add(table);
}
private void CreateText(TableCell cell)
{
//将Text写入表格中
cell.Text = Text;
}
5.重写父类的Render方法,将服务器控件的内容传递给HtmlTextWriter对象以在客户端显示,在该方法中调用了
PrepareControlForRender方法,用于在呈现前进行其他样式的设置
/// <summary>
/// 将服务器控件的内容传递给HtmlTextWriter对象以在客户端呈现内容
/// </summary>
/// <param name="writer"></param>
protected override void Render(HtmlTextWriter writer)
{
PrepareControlForReader();
base.Render(writer);
}
/// <summary>
/// 用于在呈现前进行其他样式的设置,在本控件中,只是简单的设置了表格的CellSpacing和
CellPadding属性:
/// </summary>
private void PrepareControlForReader()
{
if (this.Controls.Count < 1)
return;
Table table = (Table)this.Controls[0];
table.CellSpacing = 0;
table.CellPadding = 0;
}
OK,做好了,我们在页面上试试吧
1.页面上自定义控件什么
<%@ Register Assembly="WebControlLibrary" Namespace="WebControlLibrary" TagPrefix="cc" %>
2.在页面相应位置定义自定义控件:
<cc:MyControl ID="MyControl" runat="server" Text="Hello World!"
Font-Size="12px" />
好了,运行起来看看吧,呵呵、
其他:
1.如果经常用该控件,每次进来都声明是不是很麻烦呢,写入web.config吧,这样直接用就可以了
<pages>
<controls>
<add tagPrefix="cc" assembly="WebControlLibrary" namespace="WebControlLibrary"/>
</controls>
</pages>
2.如果我们自定义的控件中用到了图片,做如下处理就可以了
找到你的AssemblyInfo.cs,导入命名空间 using System.Web.UI;
之后
//import webresource
[assembly: WebResource("WebControlLibrary.images.stars.jpg", "image/jpg")]
这样图片就打入程序集里边了,终于有封装的感觉了。