主题,复合控件的一些概况(复合控件的样式和事件都是比较麻烦的,所以还是还重最简单的入手)
概况
前几章弄的都是一些简单控件,有时候,我们可能需要开发一些更加复杂的控件,比如微软自带的登陆控件,如果我们还继承webControl
类,然后重写复合控件里的每一个子控件,包括她们的事件,处理回传事件,回传数据,状态维护…
等,为了做一个小小的控件,代码却上千行,都快要疯了 .
是的,使用复合控件,可以在一定程度上减轻开发人员的开发难度,她的子控件可以自己维护自己的状态,可以自己呈现自己等。当然,如果她的子控件定义自定义的样式类型,那么子控件的样式还得开发人员自己来维护。
“拿来“道不远人(希望THIN见谅)
图一(还是直接看效果图吧)

控件组成说明
控件分四部分,一部分,控件自己本身,即容器本身;二部分,up按纽;三部分down按纽;四部分,textbox文本框。
控件设置
四部分的边框都设置成5px,然后再分别设置四部分的的边框颜色,定义后三部分的定位方式,包括position,right,left,top,button等,但遗憾的是,默认的Style类型并没有定位position等定位样式属性,怎么办呢?当然只能重子控件的样式类型了,为了减低复杂度,这里先不讨论她的事件。
图二(先看控件的组成代码)
定义部分

Code
TextBox _txt;
LinkButton _lbtnUp;
System.Web.UI.WebControls.Image _imgUp;
System.Web.UI.WebControls.Image _imgDown;
LinkButton _lbtnDown;
将子控件一一放入Controls

Code
protected override void CreateChildControls()


{
Controls.Clear();
_txt = new TextBox();
_txt.Text = "0";
Controls.Add(_txt);
_lbtnUp = new LinkButton();
_imgUp = new System.Web.UI.WebControls.Image();
_imgUp.Attributes["Style"] = "border-width:0px;position:relative;top:-3px;";
_imgUp.ImageUrl = DesignMode ? "up.gif" : ResolveUrl("~/up.gif");
_lbtnUp.Controls.Add(_imgUp);
_lbtnUp.CommandName = "Add";
_lbtnUp.CommandArgument = Step.ToString();
Controls.Add(_lbtnUp);
_lbtnDown = new LinkButton();
_lbtnDown.CommandName = "Reduce";
_lbtnDown.CommandArgument = (Step * -1).ToString();
_imgDown = new System.Web.UI.WebControls.Image();
_imgDown.Attributes["Style"] = "border-width:0px;position:relative;top:-3px;";
_imgDown.ImageUrl = DesignMode ? "down.gif" : ResolveUrl("~/down.gif");
_lbtnDown.Controls.Add(_imgDown);
Controls.Add(_lbtnDown);
}
定义复合控件最外层元素(DIV)的属性

Code
protected override void AddAttributesToRender(HtmlTextWriter writer)

{
ControlStyle.AddAttributesToRender(writer);
writer.AddStyleAttribute(HtmlTextWriterStyle.Padding, "0px");
writer.AddAttribute(HtmlTextWriterAttribute.Id, ClientID);
writer.AddAttribute(HtmlTextWriterAttribute.Name, UniqueID);
}
定义复合控件的最外层元素DIV

Code
protected override HtmlTextWriterTag TagKey

{
get

{
return HtmlTextWriterTag.Div;
}
}
将子控件的样式一一扔进writer流,并改写子控件样式(自己的PositionStyle类型,后面会着重说明)

Code
protected override void RenderChildren(HtmlTextWriter writer)

{
InputStyle.AddAttributesToRender(writer);
_txt.RenderControl(writer);
UpButtonStyle.AddAttributesToRender(writer);
_lbtnUp.RenderControl(writer);
DownButtonStyle.AddAttributesToRender(writer);
_lbtnDown.RenderControl(writer);
}
整个控件的呈现过程到此结束
本想在这里,把控件的样式也说了算了,但考虑到可能篇幅太长,看得太累,还是留着下一节再说(待续中...)
一点牢骚
其实可以多看看别人写的一些控件,比如我要学习复合自定义的样式,直接看看TableStyle样式就得了,看看她是怎么实现的,照葫芦画瓢就是了:)
demo将在下一节中提供,抱歉...