1、我们建一个类叫TestControl2,继承WebControl,重写RenderContents方法,增加了几个属性,以便后面有用到。

  1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Web.UI;
6 using System.Web.UI.WebControls;
7
8 namespace WebFormControl
9 {
10 public class TestControl2:WebControl
11 {
12 /// <summary>
13 /// 将控件的内容呈现到指定的编写器中。此方法主要由控件开发人员使用。
14 /// </summary>
15 /// <param name="writer">System.Web.UI.HtmlTextWriter,表示要在客户端呈现 HTML 内容的输出流</param>
16 protected override void RenderContents(HtmlTextWriter writer)
17 {
18 writer.AddStyleAttribute(HtmlTextWriterStyle.Height, "50px");
19 writer.AddAttribute(HtmlTextWriterAttribute.Border, "1");
20 writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "2");
21 writer.AddAttribute(HtmlTextWriterAttribute.Cellspacing, "3");
22 writer.RenderBeginTag(HtmlTextWriterTag.Table);
23 writer.RenderBeginTag(HtmlTextWriterTag.Tr);
24 writer.RenderBeginTag(HtmlTextWriterTag.Td);
25 writer.Write(NameLable);
26 writer.RenderEndTag();
27 writer.RenderBeginTag(HtmlTextWriterTag.Td);
28 writer.AddAttribute(HtmlTextWriterAttribute.Id, NameId);
29 writer.AddAttribute(HtmlTextWriterAttribute.Type, "text");
30 writer.AddAttribute(HtmlTextWriterAttribute.Name, NameName);
31 writer.RenderBeginTag(HtmlTextWriterTag.Input);
32 writer.RenderEndTag();
33 writer.RenderEndTag();
34 writer.RenderEndTag();
35 writer.RenderBeginTag(HtmlTextWriterTag.Tr);
36 writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2");
37 writer.AddAttribute(HtmlTextWriterAttribute.Align, "center");
38 writer.RenderBeginTag(HtmlTextWriterTag.Td);
39 writer.AddAttribute(HtmlTextWriterAttribute.Id, ShowNameId); //纠正下上几章的Txt换成Btn
40 writer.AddAttribute(HtmlTextWriterAttribute.Type, "submit");
41 writer.AddAttribute(HtmlTextWriterAttribute.Value, ShowNameLable);
42 writer.AddAttribute(HtmlTextWriterAttribute.Name, ShowNameName);
43 writer.RenderBeginTag(HtmlTextWriterTag.Input);
44 writer.RenderEndTag();
45 writer.RenderEndTag();
46 writer.RenderEndTag();
47 writer.RenderEndTag();
48 base.RenderContents(writer);
49 }
50 /// <summary>
51 /// Name的id
52 /// </summary>
53 protected virtual string NameId
54 {
55 get { return "Txt_Name"; }
56 }
57 /// <summary>
58 /// Name的name
59 /// </summary>
60 protected virtual string NameName
61 {
62 get { return "Txt_Name"; }
63 }
64
65 protected virtual string ShowNameId
66 {
67 get { return "Btn_Show"; }
68 }
69
70 protected virtual string ShowNameName
71 {
72 get { return "Btn_Show"; }
73 }
74 /// <summary>
75 /// Name的值
76 /// </summary>
77 public virtual string NameLable
78 {
79 get
80 {
81 return ViewState["NameLable"] != null ? (string)ViewState["NameLable"] : "姓名";
82 }
83 set
84 {
85 ViewState["NameLable"] = value;
86 }
87 }
88
89 public virtual string ShowNameLable
90 {
91 get
92 {
93 return ViewState["ShowNameLable"] != null ? (string)ViewState["ShowNameLable"] : "显示";
94 }
95 set
96 {
97 ViewState["ShowNameLable"] = value;
98 }
99 }
100 }
101 }

2、将控件放到网页上显示,会看到这样HTML源码

1 <span id="TestControl21"><table border="1" cellpadding="2" cellspacing="3" style="height:50px;">
2 <tr>
3 <td>姓名</td><td><input id="Txt_Name" type="text" name="Txt_Name" /></td>
4 </tr><tr>
5 <td colspan="2" align="center"><input id="Btn_Show" type="submit" value="显示" name="Btn_Show" /></td>
6 </tr>
7 </table></span>

3、我们在类里面根本没写span标签怎么在Html源码中怎么会有呢?因为我们默认最外层的元素就是span,换言之,我们上章末尾提到的3个块的其中两个RenderBeginTag和RenderEndTag方法生成了Html元素span的打开了关闭标记,然而,WebControl类没有将最外层元素的Htmlspan进行硬编码,相反,该类公开了个属性TagKey,我们只要重写这个属性就可以了,将最外层设置为Table,再对CreateControlStyle方法修改,让CreateControlStyle返回TableStyle对象,然后对RenderContents方法修改,再增加几个表格属性的属性

1 protected override HtmlTextWriterTag TagKey
2 {
3 get
4 {
5 return HtmlTextWriterTag.Table;
6 }
7 }

 

1         protected override Style CreateControlStyle()
2 {
3 return new TableStyle(ViewState);//控件与ControlStyle共享ViewState
4 //return base.CreateControlStyle();
5 }

 

 1         /// <summary>
2 /// 将控件的内容呈现到指定的编写器中。此方法主要由控件开发人员使用。
3 /// </summary>
4 /// <param name="writer">System.Web.UI.HtmlTextWriter,表示要在客户端呈现 HTML 内容的输出流</param>
5 protected override void RenderContents(HtmlTextWriter writer)
6 {
7 /*注释掉和表格有关的属性,把这些属性设置成属性
8 writer.AddStyleAttribute(HtmlTextWriterStyle.Height, "50px");
9 writer.AddAttribute(HtmlTextWriterAttribute.Border, "1"); //由于样式里没有Border属性我们将在后面自定义的时候讲到
10 writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "2");
11 writer.AddAttribute(HtmlTextWriterAttribute.Cellspacing, "3");
12 writer.RenderBeginTag(HtmlTextWriterTag.Table);
13 */
14 writer.RenderBeginTag(HtmlTextWriterTag.Tr);
15 writer.RenderBeginTag(HtmlTextWriterTag.Td);
16 writer.Write(NameLable);
17 writer.RenderEndTag();
18 writer.RenderBeginTag(HtmlTextWriterTag.Td);
19 writer.AddAttribute(HtmlTextWriterAttribute.Id, NameId);
20 writer.AddAttribute(HtmlTextWriterAttribute.Type, "text");
21 writer.AddAttribute(HtmlTextWriterAttribute.Name, NameName);
22 writer.RenderBeginTag(HtmlTextWriterTag.Input);
23 writer.RenderEndTag();
24 writer.RenderEndTag();
25 writer.RenderEndTag();
26 writer.RenderBeginTag(HtmlTextWriterTag.Tr);
27 writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2");
28 writer.AddAttribute(HtmlTextWriterAttribute.Align, "center");
29 writer.RenderBeginTag(HtmlTextWriterTag.Td);
30 writer.AddAttribute(HtmlTextWriterAttribute.Id, ShowNameId);
31 writer.AddAttribute(HtmlTextWriterAttribute.Type, "submit");
32 writer.AddAttribute(HtmlTextWriterAttribute.Value, ShowNameLable);
33 writer.AddAttribute(HtmlTextWriterAttribute.Name, ShowNameName);
34 writer.RenderBeginTag(HtmlTextWriterTag.Input);
35 writer.RenderEndTag();
36 writer.RenderEndTag();
37 writer.RenderEndTag();
38 //writer.RenderEndTag();
39 base.RenderContents(writer);
40 }

 

 1  public virtual int CellSpacing
2 {
3 get { return ((TableStyle)ControlStyle).CellSpacing; }
4 set { ((TableStyle)ControlStyle).CellSpacing = value; }
5 }
6
7 public virtual int CellPadding
8 {
9 get { return ((TableStyle)ControlStyle).CellPadding; }
10 set { ((TableStyle)ControlStyle).CellPadding = value; }
11 }

 

4、把改好的再编译下,拖到页面上看下的源码,没有span标签了

1  <table id="TestControl21" cellspacing="3" cellpadding="2">
2 <tr>
3 <td>姓名</td><td><input id="Txt_Name" type="text" name="Txt_Name" /></td>
4 </tr><tr>
5 <td colspan="2" align="center"><input id="Btn_Show" type="submit" value="显示" name="Btn_Show" /></td>
6 </tr>
7 </table>

代码下载地址:点击下载

作者: 等待冰柠檬 发表于 2011-08-26 15:57 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架
新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"