自定义控件分两种:简单控件与组合控件
一.简单控件
1.直接从现有的服务器控件继承,比如:myControl:Button
这样的好处是简单方便,不用自己再额外写属性与事件,坏处是性能不高,因为里面有太多的我们不需要的东西。
2.从Control或WebControl继承
这样子就相当于将控件从头写一遍。比如:
public class MyTextBox : System.Web.UI.Control, System.Web.UI.IPostBackDataHandler
{
public string Text
{
get { return (string)ViewState["text"]; }
set { ViewState["text"] = value; }
}
public bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
{
string oldValue = Text;
string newValue = postCollection[this.UniqueID];
if (oldValue == null || oldValue != newValue)
{
Text = newValue;
return true;
}
return false;
}
public void RaisePostDataChangedEvent() { }
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
StringBuilder sb = new StringBuilder();
sb.Append("");
writer.Write(sb.ToString());
}
}
在这里,我们需要重写Render方法。它主要负责控件的呈现,因为我们知道,不管哪种控件,到了客户端一律变成Html代码。在这段代码的最上面是它的一个属性,当然,你也可以跟它加上自定义事件。
这个控件实现了IPostBackDataHandler接口,于是就实现了IsPostBack功能。LoadPostData是主事件,由它来验证值是否发生了变化。从Text属性中我们可以访问旧值,从postCollection集合内我们可以访问新值。如果发生了变化,就返回True,否则返回false
由于在这个控件内实现了IsPostBack,在页面输入完成后按下回车键,所做的操作就是回发,而不是重新刷新页面。
二.组合控件
从CompositeControl继承
也是两种思路:直接组合服务器控件或者完成手写
1.直接组合服务器控件
public class MyInput:CompositeControl
{
private TextBox _textBox;
private Label _labal;
private Button _button;
protected override void CreateChildControls()
{
_textBox = new TextBox();
_textBox.ID = "my1";
this.Controls.Add(_textBox);
_labal = new Label();
_labal.ID = "my2";
this.Controls.Add(_labal);
_button = new Button();
_button.ID = "my3";
Controls.Add(_button);
_button.Click += new EventHandler(_button_Click);
}
void _button_Click(object sender, EventArgs e)
{
_labal.Text = _textBox.Text;
}
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
writer.RenderBeginTag(HtmlTextWriterTag.Table);
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
_textBox.RenderControl(writer);
writer.RenderEndTag();
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
_labal.RenderControl(writer);
writer.RenderEndTag();
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
_button.RenderControl(writer);
writer.RenderEndTag();
writer.RenderEndTag();
writer.RenderEndTag();
}
}
在CreateChildControls()事件中将服务器控件进行生成与注册,在Render事件中生成Html代码。在这里,是调用控件的RenderControl方法直接生成代码。
2手写。
那就是直接在Render事件把调用服务器自带的RenderControl方法换成自己手写的代码就可以了,同样,需要自己定义属性与方法,事件。
浅析asp.net的自定义控件
最新推荐文章于 2018-11-07 11:08:03 发布