回发星级控件

  1. using System;
  2. using System.ComponentModel;
  3. using System.Web.UI;
  4. using System.Web.UI.WebControls;
  5. using System.Web.UI.HtmlControls;
  6.  
  7. namespace ControlLibrary
  8. {
  9. public class PostStar : WebControl, IPostBackEventHandler, INamingContainer
  10. {
  11. private event EventHandler<StarEventArgs> _postScore;
  12.  
  13. public event EventHandler<StarEventArgs> PostScore
  14. {
  15. add
  16. {
  17. _postScore += value;
  18. }
  19. remove
  20. {
  21. _postScore -= value;
  22. }
  23. }
  24.  
  25. private void OnPostScore(object sender, StarEventArgs e)
  26. {
  27. if (_postScore != null)
  28. _postScore(sender, e);
  29.  
  30. TableCell cell = ((Table)this.Controls[]).Rows[].Cells[];
  31. Panel panCur = (Panel)cell.Controls[].Controls[];
  32. panCur.Style.Add("width", e.Score * + "px");
  33. Panel panChange = (Panel)panCur.Controls[];
  34. panChange.Style.Add("display", "none");
  35. HtmlGenericControl ul = (HtmlGenericControl)cell.Controls[].Controls[];
  36. ul.Style.Add("display", "none");
  37.  
  38. }
  39.  
  40. [DefaultValue()]
  41. public int Score
  42. {
  43. get
  44. {
  45. object obj = ViewState["Score"];
  46. return obj == null ? : Convert.ToInt32(obj);
  47. }
  48. internal set
  49. {
  50. ViewState["Score"] = value;
  51. }
  52. }
  53.  
  54. public string Comment
  55. {
  56. get
  57. {
  58. object obj = ViewState["Comment"];
  59. return obj == null ? string.Empty : Convert.ToString(obj);
  60. }
  61. set
  62. {
  63. ViewState["Comment"] = value;
  64. }
  65. }
  66.  
  67. protected override void CreateChildControls()
  68. {
  69. base.CreateChildControls();
  70.  
  71. CreateControlHierarchy();
  72. }
  73.  
  74. protected virtual void CreateControlHierarchy()
  75. {
  76. Table table = new Table();
  77. TableRow row = new TableRow();
  78. table.Rows.Add(row);
  79. TableCell comment = new TableCell();
  80. CreateComment(comment);
  81. row.Cells.Add(comment);
  82.  
  83. TableCell stars = new TableCell();
  84.  
  85. CreateStars(stars);
  86.  
  87. row.Cells.Add(stars);
  88.  
  89. this.Controls.Add(table);
  90. }
  91.  
  92. /// <summary>
  93. /// 向单元格中创建注释标签
  94. /// </summary>
  95. /// <param name="cell">单元格对象</param>
  96. private void CreateComment(TableCell cell)
  97. {
  98. cell.Text = Comment;
  99. }
  100.  
  101. /// <summary>
  102. /// 向单元格中创建星形图案
  103. /// </summary>
  104. /// <param name="cell"></param>
  105. private void CreateStars(TableCell cell)
  106. {
  107. RegisterCSS();
  108.  
  109. string starPath = Page.ClientScript.GetWebResourceUrl(this.GetType(), "ControlLibrary.Image.stars.gif");
  110.  
  111. Panel panBg = CreateBackPanel(starPath);
  112.  
  113. cell.Controls.Add(panBg);
  114.  
  115. Panel panCur = CreateCurrentPanel(starPath);
  116. Panel panChange = CreateChangePanel(starPath);
  117. HtmlGenericControl ul = CreateList();
  118.  
  119. panBg.Controls.Add(ul);
  120.  
  121. panBg.Controls.Add(panCur);
  122. panCur.Controls.Add(panChange);
  123. }
  124.  
  125. private void RegisterCSS()
  126. {
  127. string css = Page.ClientScript.GetWebResourceUrl(this.GetType(), "ControlLibrary.CSS.star.css");
  128.  
  129. HtmlLink link = new HtmlLink();
  130. link.Href = css;
  131. link.Attributes.Add("rel", "stylesheet");
  132. link.Attributes.Add("type", "text/css");
  133.  
  134. Page.Header.Controls.Add(link);
  135. }
  136.  
  137. private Panel CreateBackPanel(string starPath)
  138. {
  139. Panel panBg = new Panel();
  140.  
  141. panBg.ID = "divBg";
  142. panBg.Style.Add(HtmlTextWriterStyle.BackgroundImage, starPath);
  143.  
  144. panBg.CssClass = "stars";
  145.  
  146. return panBg;
  147. }
  148.  
  149. private Panel CreateCurrentPanel(string starPath)
  150. {
  151. Panel panCur = new Panel();
  152.  
  153. panCur.ID = "divCur";
  154. panCur.Style.Add(HtmlTextWriterStyle.BackgroundImage, starPath);
  155. panCur.CssClass = "current";
  156.  
  157. return panCur;
  158. }
  159.  
  160. private Panel CreateChangePanel(string starPath)
  161. {
  162. Panel panChange = new Panel();
  163.  
  164. panChange.ID = "divChange";
  165. panChange.Style.Add(HtmlTextWriterStyle.BackgroundImage, starPath);
  166.  
  167. panChange.CssClass = "change";
  168.  
  169. return panChange;
  170. }
  171.  
  172. private HtmlGenericControl CreateList()
  173. {
  174. HtmlGenericControl ul = new HtmlGenericControl("ul");
  175.  
  176. ul.ID = "ulist";
  177.  
  178. ul.Attributes.Add("class", "ulist");
  179.  
  180. for (int i = ; i < ; i++)
  181. {
  182. HtmlGenericControl li = new HtmlGenericControl("li");
  183. li.Attributes.Add("value", (i + ).ToString());
  184.  
  185. ul.Controls.Add(li);
  186. }
  187.  
  188. return ul;
  189. }
  190.  
  191. public void RaisePostBackEvent(string args)
  192. {
  193. if (!string.IsNullOrEmpty(args))
  194. {
  195. EnsureChildControls();
  196.  
  197. int score = Convert.ToInt32(args);
  198.  
  199. StarEventArgs e = new StarEventArgs();
  200. e.Score = score;
  201.  
  202. OnPostScore(this, e);
  203. }
  204. }
  205.  
  206. protected override void Render(HtmlTextWriter writer)
  207. {
  208. PrepareControlForRender();
  209.  
  210. base.Render(writer);
  211. }
  212.  
  213. private void PrepareControlForRender()
  214. {
  215. if (this.Controls.Count < )
  216. return;
  217.  
  218. Table table = (Table)this.Controls[];
  219.  
  220. table.CellSpacing = ;
  221. table.CellPadding = ;
  222.  
  223. TableCell cell = table.Rows[].Cells[];
  224. Panel panCur = (Panel)cell.Controls[].Controls[];
  225. Panel panChange = (Panel)panCur.Controls[];
  226. HtmlGenericControl ul = (HtmlGenericControl)cell.Controls[].Controls[];
  227.  
  228. for (int i = ; i < ul.Controls.Count; i++)
  229. {
  230. HtmlGenericControl li = (HtmlGenericControl)ul.Controls[i];
  231. li.Attributes.Add("onmouseover", "document.getElementById('" + panChange.ClientID + "').style.width='" + * (i + ) + "px';");
  232. li.Attributes.Add("onmouseout", "document.getElementById('" + panChange.ClientID + "').style.width='0px';");
  233. li.Attributes.Add("onclick", Page.ClientScript.GetPostBackClientHyperlink(this, (i + ).ToString()));
  234. }
  235. }
  236. }
  237.  
  238. public class StarEventArgs : EventArgs
  239. {
  240. public int Score
  241. {
  242. get;
  243. set;
  244. }
  245. }
  246. }

页面调用:

  1. <html xmlns="http://www.w3.org/1999/xhtml">
  2. <head runat="server">
  3. <title></title>
  4. </head>
  5. <body>
  6. <form id="form1" runat="server">
  7. <div>
  8. <cc:PostStar ID="star" runat="server" Comment="Windows XP" OnPostScore="star_PostScore" />
  9. <br />
  10. <cc:PostStar ID="star2" runat="server" Comment="VISTA" OnPostScore="star_PostScore" />
  11. </div>
  12. </form>
  13. </body>
  14. </html>

后台:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.UI;
  6. using System.Web.UI.WebControls;
  7.  
  8. public partial class PostStarTest : System.Web.UI.Page
  9. {
  10. protected void Page_Load(object sender, EventArgs e)
  11. {
  12.  
  13. }
  14.  
  15. protected void star_PostScore(object sender, ControlLibrary.StarEventArgs e)
  16. {
  17. Response.Write(e.Score);
  18. }
  19. }

结果:

更多自定义控件的源代码

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. 001_bytearray

    bytearray([source [, encoding [, errors]]]) 中文说明: bytearray([source [, encoding [, errors]]])返回一个byt ...

  2. 破解NET的四大神器

     原本这篇文章可以更早一星期写出来与大家分享,由于某方面的原因耽搁到现在,心里竟有那么一点好像对不住大家的感觉.这当然与神器有关,因为我发现利用这四大神器我似乎觉得几乎所有的NET程序破解都不在话下了 ...

  3. IoC模式(Inversion of Control)

      1.依赖 依赖就是有联系,有地方使用到它就是有依赖它,一个系统不可能完全避免依赖.如果你的一个类或者模块在项目中没有用到它,恭喜你,可以从项目中剔除它或者排除它了,因为没有一个地方会依赖它.下面看 ...

  4. OC内存管理基础

    OC 内存管理基础 一. retain和release基本使用 使用注意: 1.你想使用(占用)某个对象,就应该让对象的计数器+1(让对象做一次retain操作) 2.你不想再使用(占用)某个对象,就 ...

  5. swift 个人笔记

    swift是现代编程语言的综合体,灵活而强大. //http://www.cocoachina.com/newbie/basic/2014/0604/8675.html //语法var 变量,let ...

  6. Codeforces Round #179 (Div. 1) A. Greg and Array 离线区间修改

    A. Greg and Array Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/295/pro ...

  7. 谷歌插件开发(实现CSDN快速登陆)

    谷歌浏览器插件带来了很大的方便,于是就想着是不是也可以开发一个来用用.几经折腾下,开发了个CSDN快速 登陆的插件.下面简述一下开发的步骤. 1.开发工具:谷歌浏览器(我开发时用的是chrome 30 ...

  8. Android 浅谈相机研发

    在android中应用相机功能,一般有两种:一种是直接调用系统相机,一种自己写的相机.        我将分别演示两种方式的使用: 第一种:是使用Intent跳转到系统相机,action为:andro ...

  9. debian7编译内核

    第一个步骤“配置内核”. 在这里,我比较建议在发行版默认的config的基础上再进行配置,这样 配置出的内核和发行版本身才会有更好的相容性.比如可以在运行“make menuconfig”之前执行命令 ...

  10. scala Option 里的 orNull orElse getOrElse 区别和使用

    Scala Option Scala Option类型用来表示一个值是可选的(有值或无值) Option[T] 是一个类型为 T 的可选值的容器: 如果值存在, Option[T] 就是一个 Some ...