波斯马BOSSMA Information Technology

ASP.NET自定义控件开发系列(三)

发布时间:2008年5月4日 / 分类:ASP.NET / 9,373 次浏览 / 评论

突然发现不知道该写点什么了,记得当初做模版控件的时候遇到一个问题,这一篇文章就介绍一下模版控件的开发吧。
我想分两块来讲:

一、给现有的标准数据控件(如:Repeater )创建动态模版
二、创建可以使用模版的控件。

一、给现有的标准数据控件(如:Repeater )创建模版

1、首先创建一个模版类:在这个模版中,我们要显示人员的姓名;并且人员的姓名是一个LinkButton,可以点击。

 
    //Repeater模版
    internal class PersonTemplate : Control, ITemplate
    {
        string _Code;
        string _Name;

        public PersonTemplate(string Code, string Name)
        {
            _Code = Code;
            _Name = Name;
        }

        void ITemplate.InstantiateIn(Control container)
        {

            LinkButton linkButton1 = new LinkButton();
            linkButton1.ID = "lkbutton";
            linkButton1.CommandName = "SelectPerson";
            linkButton1.CausesValidation = false;
            linkButton1.DataBinding += new EventHandler(this.LinkButtonBindData);
            container.Controls.Add(new LiteralControl("
"));
            container.Controls.Add(linkButton1);
        }
        void LinkButtonBindData(object sender, System.EventArgs e)
        {
            LinkButton lButton1 = sender as LinkButton;
            lButton1.CommandArgument = DataBinder.Eval(lButton1.NamingContainer, "DataItem." + _Code).ToString();
            lButton1.Text = DataBinder.Eval(lButton1.NamingContainer, "DataItem." + _Name).ToString();
        }
    }

2、然后创建一个Panel,用于存放模版

internal class BasicPanel : Panel, INamingContainer
    {
        public BasicPanel()
        {
        }
    }

3、控件部分:

 [DefaultProperty("Text")]
    [ToolboxData("<{0}:MyRepeater runat=server>")]
    [Designer(typeof(VeryCodes.Controls.Web.WebControlsDesigner))]
    public class MyRepeater : CompositeControl
    {
        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("")]
        [Localizable(true)]
        public string Text
        {
            get
            {
                String s = (String)ViewState["Text"];
                return ((s == null) ? String.Empty : s);
            }

            set
            {
                ViewState["Text"] = value;
            }
        }

        private BasicPanel panel1;//搜索结果列表Panel
        private Repeater rp;//搜索结果列表
        private Label lb1;//选中项

        //绑定数据源
        [Bindable(true)]
        [Browsable(false)]
        public DataTable DataSource
        {
            get
            {
                if (ViewState[this.ClientID + "DataSource"] != null)
                {
                    return (DataTable)ViewState[this.ClientID + "DataSource"];
                }
                else
                {
                    return null;
                }
            }

            set
            {
                ViewState[this.ClientID + "DataSource"] = value;
            }
        }

        //重写Controls属性
        public override ControlCollection Controls
        {
            get
            {
                EnsureChildControls();
                return base.Controls;
            }
        }

        //重写Render方法
        protected override void Render(HtmlTextWriter output)
        {
            this.lb1.RenderControl(output);
            this.panel1.RenderControl(output);
        }

        //重写OnPreRender方法
        protected override void OnPreRender(EventArgs e)
        {
            rp.DataSource = DataSource;
            rp.DataBind();
        }

        //重写创建子控件
        protected override void CreateChildControls()
        {
            Controls.Clear();
            CreateComponent();
            SetComponentEvent();
        }

        //添加子控件,并设置各个子控件的属性
        private void CreateComponent()
        {
            lb1 = new Label();
            panel1 = new BasicPanel();
            rp = new Repeater();

            lb1.ID = "lb1";
            Controls.Add(lb1);

            panel1.ID = "Panel1";

            BasicPanel progressPanel = new BasicPanel();
            if (rp.ItemTemplate == null)
            {
                rp.ItemTemplate = new PersonTemplate("Code", "Name");
            }
            rp.ItemTemplate.InstantiateIn(progressPanel);

            rp.ID = "Repeater1";
            panel1.Controls.Add(rp);
            panel1.Controls.Add(progressPanel);

            Controls.Add(panel1);
        }

        //添加控件按钮触发事件
        private void SetComponentEvent()
        {
            this.rp.ItemCommand += new System.Web.UI.WebControls.RepeaterCommandEventHandler(this.lkbSelect_Click);
        }

        //单击模版内的按钮触发事件
        protected void lkbSelect_Click(object sender, RepeaterCommandEventArgs e)
        {
            if (e.Item.ItemIndex >= 0)
            {
                if (e.CommandName == "SelectPerson")
                {
                    LinkButton lnkButton = e.Item.FindControl("lkbutton") as LinkButton;

                    lb1.Text = "选择项是:" + lnkButton.Text;
                }
            }
        }

MyRepeater这个控件就到此为止了,需要在包含控件的页面中绑定一个数据源给它,例如

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            DataTable dt = new DataTable();

            dt.Columns.Add("Code");
            dt.Columns.Add("Name");

            DataRow dr = dt.NewRow();

            dr[0] = "001";
            dr[1] = "张三";

            dt.Rows.Add(dr);

            DataRow dr1 = dt.NewRow();

            dr1[0] = "002";
            dr1[1] = "李四";

            dt.Rows.Add(dr1);

            DataRow dr2 = dt.NewRow();

            dr2[0] = "003";
            dr2[1] = "王五";

            dt.Rows.Add(dr2);

            MyRepeater1.DataSource = dt;

        }
    }

二、创建可以使用模版的控件
我发现要想做好一件事,真的很难。最近因疲于工作,很少有时间研究技术,很长时间写不了多少。
我想这一部分就介绍一个最简单的模版控件了,我实在太懒了,只是贴点代码。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace VeryCodes.Controls.Web
{
    [DefaultProperty("Text")]
    [ToolboxData("<{0}:TemplateTest runat=server>")]
    public class TemplateTest : WebControl, INamingContainer//必须实现接口INamingContainer
    {
        private ITemplate _itemTemplate;

        //属性
      [Browsable(false)]
        [TemplateContainer(typeof(TemplateTest))]
        [PersistenceMode(PersistenceMode.InnerProperty)]
        public ITemplate ItemTemplate
        {
            get { return _itemTemplate; }
            set { _itemTemplate = value; }
        }

        protected override void CreateChildControls()
        {
            _itemTemplate.InstantiateIn(this);//创建模版控件
        }
    }
}

有空再看看吧

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自波斯马,原文地址《ASP.NET自定义控件开发系列(三)

关键字:

建议订阅本站,及时阅读最新文章!
【上一篇】 【下一篇】

发表评论