回发星级控件

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[]).Rows[].Cells[];
Panel panCur = (Panel)cell.Controls[].Controls[];
panCur.Style.Add("width", e.Score * + "px");
Panel panChange = (Panel)panCur.Controls[];
panChange.Style.Add("display", "none");
HtmlGenericControl ul = (HtmlGenericControl)cell.Controls[].Controls[];
ul.Style.Add("display", "none"); } [DefaultValue()]
public int Score
{
get
{
object obj = ViewState["Score"];
return obj == null ? : 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 = ; i < ; i++)
{
HtmlGenericControl li = new HtmlGenericControl("li");
li.Attributes.Add("value", (i + ).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 < )
return; Table table = (Table)this.Controls[]; table.CellSpacing = ;
table.CellPadding = ; TableCell cell = table.Rows[].Cells[];
Panel panCur = (Panel)cell.Controls[].Controls[];
Panel panChange = (Panel)panCur.Controls[];
HtmlGenericControl ul = (HtmlGenericControl)cell.Controls[].Controls[]; for (int i = ; i < ul.Controls.Count; i++)
{
HtmlGenericControl li = (HtmlGenericControl)ul.Controls[i];
li.Attributes.Add("onmouseover", "document.getElementById('" + panChange.ClientID + "').style.width='" + * (i + ) + "px';");
li.Attributes.Add("onmouseout", "document.getElementById('" + panChange.ClientID + "').style.width='0px';");
li.Attributes.Add("onclick", Page.ClientScript.GetPostBackClientHyperlink(this, (i + ).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);
}
}

结果:

更多自定义控件的源代码

http://www.cnblogs.com/liuwj/admin/Files.aspx

asp.net自定义控件的更多相关文章

  1. asp.net 自定义控件

    在Visual Studio中,所有的ASP.NET 2.0控件都是自定义控件,创建自己的自定义控件一般需要完成以下三步.(1)在站点APP_Code下创建一个新类:(2)修改这个类,让它成为WebC ...

  2. ASP.NET自定义控件组件开发 第五章 模板控件开发

    原文:ASP.NET自定义控件组件开发 第五章 模板控件开发 第五章 模板控件开发 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接 ...

  3. ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl

    原文:ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 第四章 组合控件开发CompositeControl 大家好,今天我们来实现一个自定义的控件,之前我们已经 ...

  4. ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡

    原文:ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡 CompositeControl  后篇 --事件冒泡 系列文章链接: ASP.NET ...

  5. ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇

    原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇 第三章 为控件添加事件 好了,我们之前以前开发一个控件.而且也添加了属性,开发也很规范,但是那个控件还差最后一点:添加事件. 系列 ...

  6. ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇

    原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇 第三章 为控件添加事件 后篇 前一篇文章只是简单的说了下事件,但是大家应该方法,在ASP.NET自定义控件中只是简单那么定义事件是 ...

  7. ASP.NET自定义控件组件开发 第一章 第三篇

    原文:ASP.NET自定义控件组件开发 第一章 第三篇 第三篇:第一章的完结篇 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接着待 ...

  8. ASP.NET自定义控件组件开发 第二章 继承WebControl的自定义控件

    原文:ASP.NET自定义控件组件开发 第二章 继承WebControl的自定义控件 第二章 继承于WebControl的自定义控件 到现在为止,我已经写了三篇关于自定义控件开发的文章,很感谢大家的支 ...

  9. ASP.NET自定义控件组件开发 第一章 第二篇 接着待续

    原文:ASP.NET自定义控件组件开发 第一章 第二篇 接着待续 ASP.NET自定义控件组件开发 第一章 第二篇 接着待续 很感谢大家给我的第一篇ASP.NET控件开发的支持!在写这些之前,我也看了 ...

  10. ASP.NET自定义控件组件开发 第一章 待续

    原文:ASP.NET自定义控件组件开发 第一章 待续 第一章:从一个简单的控件谈起 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接 ...

随机推荐

  1. 从Jetty、Tomcat和Mina中提炼NIO构架网络服务器的经典模式(一)

    本文转载自 http://blog.csdn.net/cutesource/article/details/6192016 如何正确使用NIO来构架网络服务器一直是最近思考的一个问题,于是乎分析了一下 ...

  2. CodeForces 732B Cormen — The Best Friend Of a Man (贪心)

    题意:给定n和k表示,狗要在任意连续两天散步次数要至少为k,然后就是n个数,表示每天的时间,让你增加最少次数使得这个条件成立. 析:贪心,策略是从开始到最后暴力,每次和前面一个相比,如果相加不够k,那 ...

  3. C# 调用第三方DLL完整实例

    C# 调用第三方DLL完整实例 分类: C/C++ 以下代码为本人在实际项目中编写的调用第三方DLL接口程序的完整代码. public class ExecuteDLL : Form { ...//忽 ...

  4. 非IE内核浏览器支持activex插件

    之前在一个B/S项目中遇到一个需求,就是客户需要在页面上对报表的布局以及显示内容,进行自定义.最后决定使用activex技术来实现.众所周知,activex是微软搞得,因此只有ie内核的浏览器才能支持 ...

  5. cocos2d-x 1970毫秒数转时间

    转自:http://www.cocos2dev.com/?p=322 做网络游戏时,服务器的时间在本地显示的时候要转成本地时间,可以利用系统函数转化. ";//假如这是服务器的时间 ] = ...

  6. 异常捕捉 ( try catch finally ) 你真的掌握了吗?

    前言:java 中的异常处理机制你真的理解了吗?掌握了吗?catch 体里遇到 return 是怎么处理? finally 体遇到 return 怎么办?finally 体里有 System.exit ...

  7. replace和insert的语句插入(转)

    SELECT INTO 和 INSERT INTO SELECT 两种表复制语句 Insert是T-sql中常用语句,Insert INTO table(field1,field2,...) valu ...

  8. Python学习 之 运算符&表达式

    1.Python运算符包括:赋值运算符.算术运算符.关系运算符.逻辑运算符. 表达式是将不同的数据(包括变量.函数)用运算符号按一定规则连接起来的一种式子. 2.赋值运算符:=.+=.-=.*=./= ...

  9. Computer Science Theory for the Information Age-6: 学习理论——VC定理的证明

    VC定理的证明 本文讨论VC理论的证明,其主要内容就是证明VC理论的两个定理,所以内容非常的枯燥,但对于充实一下自己的理论知识也是有帮助的.另外,VC理论属于比较难也比较抽象的知识,所以我总结的这些证 ...

  10. AngularJS - 插件,module注入

    Index.html <body> <div ng-app="myApp"> <div ng-controller="firstContro ...