asp.net自定义控件_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > asp.net自定义控件

asp.net自定义控件

 2013/10/30 15:12:52  守望星空  博客园  我要评论(0)
  • 摘要:回发星级控件usingSystem;usingSystem.ComponentModel;usingSystem.Web.UI;usingSystem.Web.UI.WebControls;usingSystem.Web.UI.HtmlControls;namespaceControlLibrary{publicclassPostStar:WebControl,IPostBackEventHandler,INamingContainer{privateeventEventHandler<
  • 标签:.net ASP.NET net 控件 自定义控件 自定义

回发星级控件

 

using System;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace ControlLibrary
{
    public class PostStar : WebControl, IPostBackEventHandler, INamingContainer
    {
        private event EventHandler<StarEventArgs> _postScore;

        public event EventHandler<StarEventArgs> PostScore
        {
            add
            {
                _postScore += value;
            }
            remove
            {
                _postScore -= value;
            }
        }

        private void OnPostScore(object sender, StarEventArgs e)
        {
            if (_postScore != null)
                _postScore(sender, e);

            TableCell cell = ((Table)this.Controls[0]).Rows[0].Cells[1];
            Panel panCur = (Panel)cell.Controls[0].Controls[1];
            panCur.Style.Add("width", e.Score * 16 + "px");
            Panel panChange = (Panel)panCur.Controls[0];
            panChange.Style.Add("display", "none");
            HtmlGenericControl ul = (HtmlGenericControl)cell.Controls[0].Controls[0];
            ul.Style.Add("display", "none");

        }

        [DefaultValue(0)]
        public int Score
        {
            get
            {
                object obj = ViewState["Score"];
                return obj == null ? 0 : Convert.ToInt32(obj);
            }
            internal set
            {
                ViewState["Score"] = value;
            }
        }

        public string Comment
        {
            get
            {
                object obj = ViewState["Comment"];
                return obj == null ? string.Empty : Convert.ToString(obj);
            }
            set
            {
                ViewState["Comment"] = value;
            }
        }

        protected override void CreateChildControls()
        {
            base.CreateChildControls();

            CreateControlHierarchy();
        }

        protected virtual void CreateControlHierarchy()
        {
            Table table = new Table();
            TableRow row = new TableRow();
            table.Rows.Add(row);
            TableCell comment = new TableCell();
            CreateComment(comment);
            row.Cells.Add(comment);

            TableCell stars = new TableCell();

            CreateStars(stars);

            row.Cells.Add(stars);

            this.Controls.Add(table);
        }

        /// <summary>
        /// 向单元格中创建注释标签
        /// </summary>
        /// <param name="cell">单元格对象</param>
        private void CreateComment(TableCell cell)
        {
            cell.Text = Comment;
        }

        /// <summary>
        /// 向单元格中创建星形图案
        /// </summary>
        /// <param name="cell"></param>
        private void CreateStars(TableCell cell)
        {
            RegisterCSS();

            string starPath = Page.ClientScript.GetWebResourceUrl(this.GetType(), "ControlLibrary.Image.stars.gif");

            Panel panBg = CreateBackPanel(starPath);

            cell.Controls.Add(panBg);

            Panel panCur = CreateCurrentPanel(starPath);
            Panel panChange = CreateChangePanel(starPath);
            HtmlGenericControl ul = CreateList();

            panBg.Controls.Add(ul);

            panBg.Controls.Add(panCur);
            panCur.Controls.Add(panChange);
        }

        private void RegisterCSS()
        {
            string css = Page.ClientScript.GetWebResourceUrl(this.GetType(), "ControlLibrary.CSS.star.css");

            HtmlLink link = new HtmlLink();
            link.Href = css;
            link.Attributes.Add("rel", "stylesheet");
            link.Attributes.Add("type", "text/css");

            Page.Header.Controls.Add(link);
        }

        private Panel CreateBackPanel(string starPath)
        {
            Panel panBg = new Panel();

            panBg.ID = "divBg";
            panBg.Style.Add(HtmlTextWriterStyle.BackgroundImage, starPath);

            panBg.CssClass = "stars";

            return panBg;
        }

        private Panel CreateCurrentPanel(string starPath)
        {
            Panel panCur = new Panel();

            panCur.ID = "divCur";
            panCur.Style.Add(HtmlTextWriterStyle.BackgroundImage, starPath);
            panCur.CssClass = "current";

            return panCur;
        }

        private Panel CreateChangePanel(string starPath)
        {
            Panel panChange = new Panel();

            panChange.ID = "divChange";
            panChange.Style.Add(HtmlTextWriterStyle.BackgroundImage, starPath);

            panChange.CssClass = "change";

            return panChange;
        }

        private HtmlGenericControl CreateList()
        {
            HtmlGenericControl ul = new HtmlGenericControl("ul");

            ul.ID = "ulist";

            ul.Attributes.Add("class", "ulist");

            for (int i = 0; i < 5; i++)
            {
                HtmlGenericControl li = new HtmlGenericControl("li");
                li.Attributes.Add("value", (i + 1).ToString());

                ul.Controls.Add(li);
            }

            return ul;
        }

        public void RaisePostBackEvent(string args)
        {
            if (!string.IsNullOrEmpty(args))
            {
                EnsureChildControls();

                int score = Convert.ToInt32(args);

                StarEventArgs e = new StarEventArgs();
                e.Score = score;

                OnPostScore(this, e);
            }
        }

        protected override void Render(HtmlTextWriter writer)
        {
            PrepareControlForRender();

            base.Render(writer);
        }

        private void PrepareControlForRender()
        {
            if (this.Controls.Count < 1)
                return;

            Table table = (Table)this.Controls[0];

            table.CellSpacing = 0;
            table.CellPadding = 0;

            TableCell cell = table.Rows[0].Cells[1];
            Panel panCur = (Panel)cell.Controls[0].Controls[1];
            Panel panChange = (Panel)panCur.Controls[0];
            HtmlGenericControl ul = (HtmlGenericControl)cell.Controls[0].Controls[0];

            for (int i = 0; i < ul.Controls.Count; i++)
            {
                HtmlGenericControl li = (HtmlGenericControl)ul.Controls[i];
                li.Attributes.Add("onmouseover", "document.getElementById('" + panChange.ClientID + "').style.width='" + 16 * (i + 1) + "px';");
                li.Attributes.Add("onmouseout", "document.getElementById('" + panChange.ClientID + "').style.width='0px';");
                li.Attributes.Add("onclick", Page.ClientScript.GetPostBackClientHyperlink(this, (i + 1).ToString()));
            }
        }
    }

    public class StarEventArgs : EventArgs
    {
        public int Score
        {
            get;
            set;
        }
    }
}

页面调用:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <cc:PostStar ID="star" runat="server" Comment="Windows XP" OnPostScore="star_PostScore" />
        <br />
        <cc:PostStar ID="star2" runat="server" Comment="VISTA" OnPostScore="star_PostScore" />
    </div>
    </form>
</body>
</html>

 

后台:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class PostStarTest : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void star_PostScore(object sender, ControlLibrary.StarEventArgs e)
    {
        Response.Write(e.Score);
    }
}

结果:

发表评论
用户名: 匿名