`
ljzforever
  • 浏览: 114652 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

浅析asp.net的自定义控件

阅读更多
自定义控件分两种:简单控件与组合控件 一.简单控件 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方法换成自己手写的代码就可以了,同样,需要自己定义属性与方法,事件。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics