自定义控件实现WebControl和Compositecontrol得区别

本文详细介绍了在 ASP.NET 中如何使用 CompositeControl 创建自定义控件,并通过具体示例展示了如何实现控件的创建、事件绑定及数据处理等功能。
1. 当你的自定义控件实现WebControl或者Control类时候,如果你在重写 CreateChildControls方法来创建控件,那么你在重写Render方法来实现拖拽到页面控件自动生成,那么你必须在Render方法中在调用每个控件的RenderControl()方法之前调用 EnsureChildControls() 方法来确保控件不为NULL而导致的异常.
    public class MyControls : WebControl
    {
        
private Button bt;
        
protected override void CreateChildControls()
        {
            
base.CreateChildControls();
            Controls.Clear();
            bt 
= new Button();
            bt.ID 
= this.ClientID;
            bt.Text 
= "Submit";
            Controls.Add(bt);
        }
        
protected override void Render(HtmlTextWriter writer)
        {
            
base.Render(writer);
            EnsureChildControls();
            bt.RenderControl(writer);
        }
    }

如果你的自定义控件实现CompositeControl,因为在Render方法中如果判断在设计界面,那么编译器会强迫调用EnsureChildControls()
方法调用CreateChildControls()方法创建控件。所以你无需在Render方法中再次调用。

protected internal override void Render(HtmlTextWriter writer)
{
    
if (base.DesignMode)
    {
        
this.EnsureChildControls();
    }
    
base.Render(writer);
}

//完整实例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Collections.Specialized;
namespace MyCustomizeControl
{

    public class MyControl : CompositeControl,IPostBackDataHandler
    {
        
private static readonly object objLock = new object();
        
private static readonly object objLock2 = new object();

        private TextBox txb;
        
private Button bt;
        
private LinkButton lnk_Submit;

        private string _strText = string.Empty;
        
public string strUser
        {
            
get
            {
                EnsureChildControls();
                
return (ViewState["strUser"== null? string.Empty : ViewState["strUser"].ToString();
            }
            
set
            {
                EnsureChildControls();
                ViewState[
"strUser"= value;
            }
        }

        public event EventHandler MyClick
        {
            add {
                Events.AddHandler(objLock, value);
            }
            remove
            {
                Events.RemoveHandler(objLock, value);
            }
        }
        
public event EventHandler MyLinkClick
        {
            add
            {
                Events.AddHandler(objLock2, value);
            }
            remove
            {
                Events.RemoveHandler(objLock2, value);
            }
        }

        protected void OnHandler(EventArgs e)
        {
            EventHandler eventDelegate 
= Events[objLock] as EventHandler;
            
if (eventDelegate != null)
            {
                eventDelegate(
this, e);
            }
        }
        
protected void OnLinkHandler(EventArgs e)
        {
            EventHandler eventDelegate 
= Events[objLock2] as EventHandler;
            
if (eventDelegate != null)
            {
                eventDelegate(
this, e);
            }
        }

        public string SubmitName
        {
            
get {
                
return this.ClientID + "_Submit";
            }
        }
        
public string LinkButtonName
        {
            
get
            {
                
return this.ClientID + "_LinkButton";
            }
        }
        
public string TextBoxName
        {
            
get
            {
                
return this.ClientID + "_TxtName";
            }
        }

        protected override void CreateChildControls()
        {
           
//base.CreateChildControls();
            txb = new TextBox();
            txb.ID 
= TextBoxName;

            bt = new Button();
            bt.ID 
= SubmitName;
            bt.Text 
= "Submit";

            lnk_Submit = new LinkButton();
            lnk_Submit.Text 
= "MyLink";
            lnk_Submit.ID 
= LinkButtonName;

            Controls.Add(lnk_Submit);
            Controls.Add(txb);
            Controls.Add(bt);                  
        }

        private string _stringUserName = string.Empty;
        
public string UserName
        {
            
get {
                EnsureChildControls();
                
return (ViewState["UserName"== null? string.Empty : ViewState["UserName"].ToString();
            }
            
set {
                EnsureChildControls();
                ViewState[
"UserName"= value;
            }
        }
        
protected override void OnPreRender(EventArgs e)
        {
            
base.OnPreRender(e);
            
if (this.Page != null && this.Enabled)
            {
                
this.Page.RegisterRequiresPostBack(this);
            }
        }
        
protected override bool OnBubbleEvent(object source, EventArgs args)
        {
            
if (source.GetType() == typeof(System.Web.UI.WebControls.LinkButton))
            {
                OnLinkHandler(EventArgs.Empty);
            }
            
//if (source.GetType() == typeof(System.Web.UI.WebControls.Button))
           
// {
                OnHandler(EventArgs.Empty);
           
// }
            return true;//base.OnBubbleEvent(source, args);
        }

        #region IPostBackDataHandler Members

        public bool LoadPostData(string postDataKey, NameValueCollection postCollection)
        {
            NameValueCollection nvc 
= postCollection;
            
string str = nvc[postDataKey + "$" + TextBoxName];
            
if (UserName != str)
            {
                UserName 
= str;
                
return true;
            }
            
else return true ;
          
//  throw new NotImplementedException();
        }

        public void RaisePostDataChangedEvent()
        {
            Context.Response.Write(
"hello");
           
// throw new NotImplementedException();
        }

        #endregion
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值