ASP.NET自定义控件组件开发(二)

来源:互联网 发布:德军总部旧血脉 知乎 编辑:程序博客网 时间:2024/05/19 13:29

第二章 继承WebControl的自定义控件

 到现在为止,我已经写了三篇关于自定义控件开发的文章,很感谢大家的支持!不知道大家对我讲的方式有什么好的建议,我尽量使自定义控件的技术让更多的程序员同胞接受。好了,开发开始了!

  本章还是延续上章的例子,开发一个CreditCardForm控件。

  其实本章也不难,相信大家看完后,也觉得很简单!

  我们首先开谈谈继承Control和WebControl的区别:其实二者最大的区别就是在,如果我们开发的控件继承WebControl,那么我们的控件就支持更多的CSS样式。而继承于Control的自定义控件的样式相对就少些。

  其实还有一个区别就在开发的规范上。我们来简单的看看上一章的自定义控件的代码,主要来看看Render方法中的代码:大家只扫一眼就可以了。

 1protectedoverridevoidRender(HtmlTextWriterwriter)
 2    {
 3      //显示table标记
 4      writer.AddStyleAttribute(HtmlTextWriterStyle.Width,"287px");
 5      writer.AddStyleAttribute(HtmlTextWriterStyle.Height,"128px");
 6      writer.AddStyleAttribute(HtmlTextWriterStyle.BorderWidth,"0");
 7      writer.AddAttribute(HtmlTextWriterAttribute.Id,"mytable");
 8      writer.RenderBeginTag(HtmlTextWriterTag.Table);
 9
10      //显示table类的标记包含tr,td还有一些textbox,下拉框等
11      writer.RenderBeginTag(HtmlTextWriterTag.Tr);
12
13      writer.RenderBeginTag(HtmlTextWriterTag.Td);
14      writer.Write(PaymentMethodText);
15      writer.RenderEndTag();
16
17      writer.RenderBeginTag(HtmlTextWriterTag.Td);
18      writer.AddAttribute(HtmlTextWriterAttribute.Name,"PaymentMethod");
19      writer.AddAttribute(HtmlTextWriterAttribute.Id,"PaymentMethod");
20      writer.AddStyleAttribute(HtmlTextWriterStyle.Width,"100%");
21      writer.RenderBeginTag(HtmlTextWriterTag.Select);
22
23      writer.AddAttribute(HtmlTextWriterAttribute.Value,"0");
24      writer.RenderBeginTag(HtmlTextWriterTag.Option);
25      writer.Write("Master");
26      writer.RenderEndTag();
27
28      writer.AddAttribute(HtmlTextWriterAttribute.Value,"1");
29      writer.RenderBeginTag(HtmlTextWriterTag.Option);
30      writer.Write("Visa");
31      writer.RenderEndTag();
32
33      writer.RenderEndTag();
34      writer.RenderEndTag();
35      writer.RenderEndTag();
36
37      writer.RenderBeginTag(HtmlTextWriterTag.Tr);
38      writer.RenderBeginTag(HtmlTextWriterTag.Td);
39      writer.Write(CreditCardNoText);
40      writer.RenderEndTag();
41
42      writer.RenderBeginTag(HtmlTextWriterTag.Td);
43      writer.AddAttribute(HtmlTextWriterAttribute.Type,"text");
44      writer.AddAttribute(HtmlTextWriterAttribute.Name,"CreditCardNo");
45      writer.AddAttribute(HtmlTextWriterAttribute.Id,"CreditCardNo");
46      writer.RenderBeginTag(HtmlTextWriterTag.Input);
47      writer.RenderEndTag();
48      writer.RenderEndTag();
49      writer.RenderEndTag();
50
51      writer.RenderBeginTag(HtmlTextWriterTag.Tr);
52      writer.RenderBeginTag(HtmlTextWriterTag.Td);
53      writer.Write(CardholderNameText);
54      writer.RenderEndTag();
55
56      writer.RenderBeginTag(HtmlTextWriterTag.Td);
57      writer.AddAttribute(HtmlTextWriterAttribute.Type,"text");
58      writer.AddAttribute(HtmlTextWriterAttribute.Name,"CardholderName");
59      writer.AddAttribute(HtmlTextWriterAttribute.Id,"CardholderName");
60      writer.RenderBeginTag(HtmlTextWriterTag.Input);
61      writer.RenderEndTag();
62      writer.RenderEndTag();
63      writer.RenderEndTag();
64
65      writer.RenderBeginTag(HtmlTextWriterTag.Tr);
66      writer.RenderBeginTag(HtmlTextWriterTag.Td);
67      writer.Write(ExpirationDateText);
68      writer.RenderEndTag();
69
70      writer.RenderBeginTag(HtmlTextWriterTag.Td);
71      writer.AddAttribute(HtmlTextWriterAttribute.Name,"Month");
72      writer.AddAttribute(HtmlTextWriterAttribute.Id,"Month");
73      writer.RenderBeginTag(HtmlTextWriterTag.Select);
74      for(intmonth=1;month<13;month++)
75      {
76        writer.AddAttribute(HtmlTextWriterAttribute.Value,month.ToString());
77        writer.RenderBeginTag(HtmlTextWriterTag.Option);
78        writer.Write(month.ToString());
79        writer.RenderEndTag();
80      }
81
82      writer.RenderEndTag();
83
84      writer.Write("&nbsp");
85
86      writer.AddAttribute(HtmlTextWriterAttribute.Name,"Year");
87      writer.AddAttribute(HtmlTextWriterAttribute.Id,"Year");
88      writer.RenderBeginTag(HtmlTextWriterTag.Select);
89
90      for(intyear=2008;year<2015;year++)
91      {
92        writer.AddAttribute(HtmlTextWriterAttribute.Value,year.ToString());
93        writer.RenderBeginTag(HtmlTextWriterTag.Option);
94        writer.Write(year.ToString());
95        writer.RenderEndTag();
96      }
97
98      writer.RenderEndTag();
99
100      writer.RenderEndTag();
101      writer.RenderEndTag();
102
103
104      writer.RenderBeginTag(HtmlTextWriterTag.Tr);
105      writer.AddAttribute(HtmlTextWriterAttribute.Colspan,"2");
106      writer.AddAttribute(HtmlTextWriterAttribute.Align,"center");
107      writer.RenderBeginTag(HtmlTextWriterTag.Td);
108      writer.AddAttribute(HtmlTextWriterAttribute.Type,"submit");
109      writer.AddAttribute(HtmlTextWriterAttribute.Value,SubmitButtonText);
110      writer.RenderBeginTag(HtmlTextWriterTag.Input);
111      writer.RenderEndTag();
112      writer.RenderEndTag();
113      writer.RenderEndTag();
114
115      //table的结束标记
116      writer.RenderEndTag();
117
118      
119
120
121    }

 

 相信这段代码大家都和熟悉。在这段代码的作用主要显示了一个table 以及table 之中的标记元素。

  如果一这个控件已经写好了,加入我们想要改改table的样式,如把border设为1,或者改变显示的颜色等,那么我们就

  要再次打开这段代码,修改代码。其实这就不好。为什么?

  其实这个方法中的代码做了四件事:

  1.显示控件最外层的包含标记,即table

  2.显示最外层标记的一些属性,如border.id等

  3.显示控件的主要内容 ,如,显示输入框,下拉框,按钮。

  4.显示控件最外层包含标记的结束标记。

  这样看来,这个方法的职责就有四个。大家应该还记得面向对象设计的原创:单一职责。虽然这个元素一般用在类上,

  但是我们更加要注意,这个原则用的宗旨:使对象只有一个变化的因素。这个原则也用在方法的设计上。

  就是说,我们如果想要改变最外层标记table一些属性,我们就影响了其他三个职责。同理,我们想改变其他的元素或者

  内容,结果可想而知。

  为此,继承WebControl的控件就更加的规范和灵活:

  其实,继承于WebControl的控件的显示还是在Render方法中显示,只是这个Render方法已经不由我们来写了:

  如下:

1
2    protectedoverridevoidRender(HtmlTextWriterwriter)
3    {
4       RenderBeginTag(writer);
5       RenderContens(writer);
6       RenderEndTag(writer);
7
8    }

  因为我们之前说,Render方法的职责有四个。所以WebControl的Render方法就把这些职责分离了。以后我们能就

  可以独立的改变一个因素了。大家也许奇怪:不是说有四个职责吗,但是上面只是显示了三个方法,其实在
RenderBeginTag()方法中包含显示最外层标记样式的方法。  所以我们只要分别重写这三个方法,一个继承WebControl的自定义的控件就成了。不要怕,方法很多,但是很简单,而
  且代码我们都懂,之前差不多都讲了的。
  我想把写成后的控件给大家看看,让大家看下我们本章的目标:
  
  大家看见没有:是不是支持的样式多了!!!
  好了,我们来写吧:不难哦:)
  首先看看我们要的写方法以及他们的功能:
protectedoverridevoidRender(HtmlTextWriterwriter)
    {
        //显示最外层包含标记开始的标记,即,显示<table..>
       RenderBeginTag(writer);
       //显示table标记内的内容,如<tr><td><input/>等
       RenderContens(writer);
       //显示最外层包含标记结束标记</table
       RenderEndTag(writer);
    }
  现在的思路很清晰吧,首先来显示<table....>
  很简单,只要如下就可以了。
1 protectedoverrideHtmlTextWriterTagTagKey
2    {
3      get
4      {
5        returnHtmlTextWriterTag.Table;
6      }
7    }
  不要奇怪,因为RenderBeginTag()方法内部实际是调用了这个属性来显示的最外层的包含标记的。
  好了,第一步就写完了啊!简答吧!
  下面来显示table的样式,因为我们的控件的最外层的标记是table,显示他的样式只要这样就OK了。
1 protectedoverrideStyleCreateControlStyle()
2    {
3      returnnewTableStyle(ViewState);
4    }
  又写完了一部分。。不难吧!接着看啊!
  如果你的最外层的标记是<div >那么,上面的那个方法你都不用写.
下面就写了RenderContent方法,不难,只记住这个方法的职责:显示最外层标记的内容:  如下:
 1protectedoverridevoidRenderContents(HtmlTextWriterwriter)
 2    {
 3      writer.RenderBeginTag(HtmlTextWriterTag.Tr);
 4      writer.RenderBeginTag(HtmlTextWriterTag.Td);
 5      writer.Write(PaymentMethod);
 6      writer.RenderEndTag();
 7
 8      writer.RenderBeginTag(HtmlTextWriterTag.Td);
 9
10      writer.AddAttribute(HtmlTextWriterAttribute.Id,PaymentMethodListId);
11      writer.AddAttribute(HtmlTextWriterAttribute.Name,PaymentMethodListName);
12      writer.AddStyleAttribute(HtmlTextWriterStyle.Width,"100%");
13      writer.RenderBeginTag(HtmlTextWriterTag.Select);
14
15      writer.AddAttribute(HtmlTextWriterAttribute.Value,"0");
16      writer.RenderBeginTag(HtmlTextWriterTag.Option);
17      writer.Write("Master");
18      writer.RenderEndTag();
19
20      writer.AddAttribute(HtmlTextWriterAttribute.Value,"1");
21      writer.RenderBeginTag(HtmlTextWriterTag.Option);
22      writer.Write("Visa");
23      writer.RenderEndTag();
24
25      writer.RenderEndTag();
26
27      writer.RenderEndTag();
28      writer.RenderEndTag();
29//****************************************************************************
30      writer.RenderBeginTag(HtmlTextWriterTag.Tr);
31      writer.RenderBeginTag(HtmlTextWriterTag.Td);
32      writer.Write(CreditCardNo);
33      writer.RenderEndTag();
34
35      writer.RenderBeginTag(HtmlTextWriterTag.Td);
36      writer.AddAttribute(HtmlTextWriterAttribute.Id,CreditCardNoTextId);
37      writer.AddAttribute(HtmlTextWriterAttribute.Name,CreditCardNoTextName);
38      writer.AddAttribute(HtmlTextWriterAttribute.Type,"text");
39      writer.RenderBeginTag(HtmlTextWriterTag.Input);
40      writer.RenderEndTag();
41
42      writer.RenderEndTag();
43      writer.RenderEndTag();
44//**************************************************************************************
45
46      writer.RenderBeginTag(HtmlTextWriterTag.Tr);
47      writer.RenderBeginTag(HtmlTextWriterTag.Td);
48      writer.Write(CardholderName);
49      writer.RenderEndTag();
50
51      writer.RenderBeginTag(HtmlTextWriterTag.Td);
52      writer.AddAttribute(HtmlTextWriterAttribute.Name,CardholderNameTextName);
53      writer.AddAttribute(HtmlTextWriterAttribute.Id,CardholderNameTextId);
54      writer.AddAttribute(HtmlTextWriterAttribute.Type,"text");
55      writer.RenderBeginTag(HtmlTextWriterTag.Input);
56      writer.RenderEndTag();
57
58      writer.RenderEndTag();
59      writer.RenderEndTag();
60//***************************************************************************************
61
62      writer.RenderBeginTag(HtmlTextWriterTag.Tr);
63      writer.RenderBeginTag(HtmlTextWriterTag.Td);
64      writer.Write(ExpirationDate);
65      writer.RenderEndTag();
66
67      writer.RenderBeginTag(HtmlTextWriterTag.Td);
68      writer.AddAttribute(HtmlTextWriterAttribute.Name,MonthListName);
69      writer.AddAttribute(HtmlTextWriterAttribute.Id,MonthListId);
70      writer.RenderBeginTag(HtmlTextWriterTag.Select);
71
72      for(intmonth=1;month<13;month++)
73      {
74        writer.AddAttribute(HtmlTextWriterAttribute.Value,month.ToString());
75        writer.RenderBeginTag(HtmlTextWriterTag.Option);
76        writer.Write(month.ToString());
77        writer.RenderEndTag();
78      }
79      writer.RenderEndTag();
80
81      /////////////////////////////////////
82
83      writer.Write(" ");
84
85      /////////////////////////////////////
86      writer.AddAttribute(HtmlTextWriterAttribute.Name,YearListName);
87      writer.AddAttribute(HtmlTextWriterAttribute.Id,YearListId);
88      writer.RenderBeginTag(HtmlTextWriterTag.Select);
89
90      for(intyear=2008;year<2015;year++)
91      {
92        writer.AddAttribute(HtmlTextWriterAttribute.Value,year.ToString());
93        writer.RenderBeginTag(HtmlTextWriterTag.Option);
94        writer.Write(year.ToString());
95        writer.RenderEndTag();
96      }
97      writer.RenderEndTag();
98
99      writer.RenderEndTag();
100      writer.RenderEndTag();
101//*****************************************************************************
102
103      writer.RenderBeginTag(HtmlTextWriterTag.Tr);
104      writer.AddAttribute(HtmlTextWriterAttribute.Colspan,"2");
105      writer.AddAttribute(HtmlTextWriterAttribute.Align,"center");
106      writer.RenderBeginTag(HtmlTextWriterTag.Td);
107      writer.AddAttribute(HtmlTextWriterAttribute.Name,SubmitButtonName);
108      writer.AddAttribute(HtmlTextWriterAttribute.Value,SubmitButtonText);
109      writer.AddAttribute(HtmlTextWriterAttribute.Id,SubmitButtonId);
110      writer.AddAttribute(HtmlTextWriterAttribute.Type,"submit");
111      writer.RenderBeginTag(HtmlTextWriterTag.Input);
112      writer.RenderEndTag();
113
114      writer.RenderEndTag();
115      writer.RenderEndTag();
116
117//******************************************************************************
118
119      
120    }
  这样就完了,大家看看上面的代码,很熟悉吧,是啊,只是把我们之前的代码分割开了,写在不同的地方!

  最后的那个RendEndTag(),你不写!因为,你override那个TagKey时,就已经调用了结束标记的方法。这样,一个继承WebControl的控件就完了!

  好了,写完了:完整的代码如下:

 1usingSystem;
 2usingSystem.Collections.Generic;
 3usingSystem.Text;
 4usingSystem.Web;
 5usingSystem.Web.UI;
 6usingSystem.Web.UI.WebControls;
 7
 8namespaceCreditCardForm
 9{
10  publicclassCreditCardForm5:WebControl
11  {
12    #region重写包含标记
13    
14    protectedoverrideStyleCreateControlStyle()
15    {
16      returnnewTableStyle(ViewState);
17    }
18
19    protectedoverrideHtmlTextWriterTagTagKey
20    {
21      get
22      {
23        returnHtmlTextWriterTag.Table;
24      }
25    }
26
27    //publicvirtualstringBackImageUrl
28    //{
29    //  get
30    //  {
31    //    return((TableStyle)ControlStyle).BackImageUrl;
32    //  }
33    //  set
34    //  {
35    //    ((TableStyle)ControlStyle).BackImageUrl=value;
36    //  }
37    //}
38    
39  
40    #endregion
41    #regionID
42    protectedvirtualstringPaymentMethodListId
43    {
44      get
45      {
46        return"PaymentMethod";
47      }
48    }
49
50    protectedvirtualstringCreditCardNoTextId
51    {
52      get
53      {
54        return"CreditCardNo";
55      }
56    }
57
58    protectedvirtualstringCardholderNameTextId
59    {
60      get
61      {
62        return"CardholderName";
63      }
64    }
65
66    protectedvirtualstringMonthListId
67    {
68      get
69      {
70        return"Month";
71      }
72    }
73
74    protectedvirtualstringYearListId
75    {
76      get
77      {
78        return "Year";
79      }
80    }
81
82    protectedvirtualstringSubmitButtonId
83    {
84      get
85      {
86        return"Submit";
87      }
88    }
89
90    #endregion
91    #regionname
92    protectedvirtualstringPaymentMethodListName
93    {
94      get
95      {
96        return"PaymentMethod";
97      }
98    }
99
100    protectedvirtualstringCreditCardNoTextName
101    {
102      get
103      {
104        return"CreditCardNo";
105      }
106    }
107
108    protectedvirtualstringCardholderNameTextName
109    {
110      get
111      {
112        return"CardholderName";
113      }
114    }
115
116    protectedvirtualstringMonthListName
117    {
118      get
119      {
120        return"Month";
121      }
122    }
123
124    protectedvirtualstringYearListName
125    {
126      get
127      {
128        return"Year";
129      }
130    }
131
132    protectedvirtualstringSubmitButtonName
133    {
134      get
135      {
136        return"Sumit";
137      }
138    }
139    #endregion
140
141    #region 属性
142    publicvirtualstringPaymentMethod
143    {
144      get
145      {
146        returnViewState["PaymentMethod"]!=null?(string)ViewState["PaymentMethod"]:"支付方式";
147          
148      }
149      set
150      {
151        ViewState["PaymentMethod"]=value;
152      }
153    }
154
155    publicvirtualstringCreditCardNo
156    {
157      get
158      {
159        returnViewState["CreditCardNo"]!=null?(string)ViewState["CreditCardNo"]:"信用卡号";
160      }
161      set
162      {
163        ViewState["CreditCardNo"]=value;
164      }
165    }
166
167    publicvirtualstringCardholderName
168    {
169      get
170      {
171        returnViewState["CardholderName"]!=null?(string)ViewState["CardholderName"]:"持卡人";
172      }
173      set
174      {
175        ViewState["CreditCardName"]=value;
176      }
177    }
178
179    publicvirtualstringExpirationDate
180    {
181      get
182      {
183        returnViewState["ExpirationDate"]!=null?(string)ViewState["ExpirationDate"]:"过期时间";
184      }
185      set
186      {
187        ViewState["ExpirationDate"]=value;
188      }
189    }
190
191    publicvirtualstringSubmitButtonText
192    {
193      get
194      {
195        returnViewState["SubmitButtonText"]!=null?(string)ViewState["SubmitButtonText"]:"提交";
196      }
197      set
198      {
199        ViewState["SubmitButtonText"]=value;
200      }
201    
202    }
203    #endregion
204    protectedoverridevoidRenderContents(HtmlTextWriterwriter)
205    {
206      writer.RenderBeginTag(HtmlTextWriterTag.Tr);
207      writer.RenderBeginTag(HtmlTextWriterTag.Td);
208      writer.Write(PaymentMethod);
209      writer.RenderEndTag();
210
211      writer.RenderBeginTag(HtmlTextWriterTag.Td);
212
213      writer.AddAttribute(HtmlTextWriterAttribute.Id,PaymentMethodListId);
214      writer.AddAttribute(HtmlTextWriterAttribute.Name,PaymentMethodListName);
215      writer.AddStyleAttribute(HtmlTextWriterStyle.Width,"100%");
216      writer.RenderBeginTag(HtmlTextWriterTag.Select);
217
218      writer.AddAttribute(HtmlTextWriterAttribute.Value,"0");
219      writer.RenderBeginTag(HtmlTextWriterTag.Option);
220      writer.Write("Master");
221      writer.RenderEndTag();
222
223      writer.AddAttribute(HtmlTextWriterAttribute.Value,"1");
224      writer.RenderBeginTag(HtmlTextWriterTag.Option);
225      writer.Write("Visa");
226      writer.RenderEndTag();
227
228      writer.RenderEndTag();
229
230      writer.RenderEndTag();
231      writer.RenderEndTag();
232//****************************************************************************
233      writer.RenderBeginTag(HtmlTextWriterTag.Tr);
234      writer.RenderBeginTag(HtmlTextWriterTag.Td);
235      writer.Write(CreditCardNo);
236      writer.RenderEndTag();
237
238      writer.RenderBeginTag(HtmlTextWriterTag.Td);
239      writer.AddAttribute(HtmlTextWriterAttribute.Id,CreditCardNoTextId);
240      writer.AddAttribute(HtmlTextWriterAttribute.Name,CreditCardNoTextName);
241      writer.AddAttribute(HtmlTextWriterAttribute.Type,"text");
242      writer.RenderBeginTag(HtmlTextWriterTag.Input);
243      writer.RenderEndTag();
244
245      writer.RenderEndTag();
246      writer.RenderEndTag();
247//**************************************************************************************
248
249      writer.RenderBeginTag(HtmlTextWriterTag.Tr);
250      writer.RenderBeginTag(HtmlTextWriterTag.Td);
251      writer.Write(CardholderName);
252      writer.RenderEndTag();
253
254      writer.RenderBeginTag(HtmlTextWriterTag.Td);
255      writer.AddAttribute(HtmlTextWriterAttribute.Name,CardholderNameTextName);
256      writer.AddAttribute(HtmlTextWriterAttribute.Id,CardholderNameTextId);
257      writer.AddAttribute(HtmlTextWriterAttribute.Type,"text");
258      writer.RenderBeginTag(HtmlTextWriterTag.Input);
259      writer.RenderEndTag();
260
261      writer.RenderEndTag();
262      writer.RenderEndTag();
263//***************************************************************************************
264
265      writer.RenderBeginTag(HtmlTextWriterTag.Tr);
266      writer.RenderBeginTag(HtmlTextWriterTag.Td);
267      writer.Write(ExpirationDate);
268      writer.RenderEndTag();
269
270      writer.RenderBeginTag(HtmlTextWriterTag.Td);
271      writer.AddAttribute(HtmlTextWriterAttribute.Name,MonthListName);
272      writer.AddAttribute(HtmlTextWriterAttribute.Id,MonthListId);
273      writer.RenderBeginTag(HtmlTextWriterTag.Select);
274
275      for(intmonth=1;month<13;month++)
276      {
277        writer.AddAttribute(HtmlTextWriterAttribute.Value,month.ToString());
278        writer.RenderBeginTag(HtmlTextWriterTag.Option);
279        writer.Write(month.ToString());
280        writer.RenderEndTag();
281      }
282      writer.RenderEndTag();
283
284      /////////////////////////////////////
285
286      writer.Write(" ");
287
288      /////////////////////////////////////
289      writer.AddAttribute(HtmlTextWriterAttribute.Name,YearListName);
290      writer.AddAttribute(HtmlTextWriterAttribute.Id,YearListId);
291      writer.RenderBeginTag(HtmlTextWriterTag.Select);
292
293      for(intyear=2008;year<2015;year++)
294      {
295        writer.AddAttribute(HtmlTextWriterAttribute.Value,year.ToString());
296        writer.RenderBeginTag(HtmlTextWriterTag.Option);
297        writer.Write(year.ToString());
298        writer.RenderEndTag();
299      }
300      writer.RenderEndTag();
301
302      writer.RenderEndTag();
303      writer.RenderEndTag();
304//*****************************************************************************
305
306      writer.RenderBeginTag(HtmlTextWriterTag.Tr);
307      writer.AddAttribute(HtmlTextWriterAttribute.Colspan,"2");
308      writer.AddAttribute(HtmlTextWriterAttribute.Align,"center");
309      writer.RenderBeginTag(HtmlTextWriterTag.Td);
310      writer.AddAttribute(HtmlTextWriterAttribute.Name,SubmitButtonName);
311      writer.AddAttribute(HtmlTextWriterAttribute.Value,SubmitButtonText);
312      writer.AddAttribute(HtmlTextWriterAttribute.Id,SubmitButtonId);
313      writer.AddAttribute(HtmlTextWriterAttribute.Type,"submit");
314      writer.RenderBeginTag(HtmlTextWriterTag.Input);
315      writer.RenderEndTag();
316
317      writer.RenderEndTag();
318      writer.RenderEndTag();
319
320//******************************************************************************
321
322      
323    }
324
325  }
326}
327

  希望大家继续支持啊!谢谢!

第三章 为控件添加事件

 好了,我们之前以前开发一个控件。而且也添加了属性,开发也很规范,但是那个控件还差最后一点:添加事件。

  ASP.NET的开发都是事件驱动的,现在我们就来为控件添加事件。在说事件之前,希望大家对C#的语法要熟悉,对委托很事件要懂。

  其实定义事件的步骤很简单:

  1.声明一个委托。

  2.定义一个携带事件信息的类。

  3.定义事件4.定义一个通事件发生后,通知其他对象的方法首先来理清一下我们的思路:

  1.在下拉框中选中一个值,并且在输入框中也输入相应的值。

  2.我们在页面点击“提交”按钮,按钮就触发我们自定义的一个事件Validate(验证输入信息的正确行)。

  我们在提交的时候要把控件的信息传给服务器,所以我们要定义一个事件信息类,来携带事件发生时,把个信息类送到服务器。

  事件定义如下:

  1.定义一个携带事件信息的类。

1usingSystem;
2usingSystem.Collections.Generic;
3usingSystem.Text;
4
5namespaceCreditCardForm
6{
7  publicclassValidateCreditCardFormEventArgs:EventArgs
8  {
9    privatestringpaymentMethod;
10    publicstringPaymentMethod
11    {
12      get
13      {
14        returnthis.paymentMethod;
15      }
16    }
17
18
19    privatestringcreditCardNo;
20    publicstringCreditCardNo
21    {
22      get
23      {
24        returnthis.creditCardNo;
25      }
26    }
27
28
29    privatestringcardholderName;
30    publicstringCardholderName
31    {
32      get
33      {
34        returnthis.cardholderName;
35      }
36    }
37
38    privateDateTimeexpirationDate;
39    publicDateTimeExpirationDate
40    {
41      get
42      {
43        returnthis.expirationDate;
44      }
45    }
46
47
48    publicValidateCreditCardFormEventArgs(stringpaymentmenthod,stringcreditcardno,
49      stringcardholdername,DateTimeexpirationdate)
50    {
51      this.paymentMethod=paymentmenthod;
52      this.creditCardNo=creditcardno;
53      this.cardholderName=cardholdername;
54      this.expirationDate=expirationdate;
55    }
56  }
57}
58

  2.声明一个委托。

1usingSystem;
2usingSystem.Collections.Generic;
3usingSystem.Text;
4
5namespaceCreditCardForm
6{
7  publicdelegatevoidValidateCreditCardFormEventHandler(objectsender,ValidateCreditCardFormEventArgsargs);
8}
9

  3.定义事件

1 publiceventValidateCreditCardFormEventHandlerValidateCreditCardForm;

  4.通事件发生后,通知其他对象的方法

1 
2//这个方法是受保护的虚方法
3protectedvoidOnValidateCreditCardForm(ValidateCreditCardFormEventArgsargs)
4    {
5       if(ValidateCreditCardForm!=null)
6        handler(this,args);
7    }

  这样几个步骤之后,控件的事件就写完了。大家试试! 有问题,我们下篇接着说!

  今天写到这里,希望大家反馈信息,听听大家的想法!
  前一篇文章只是简单的说了下事件,但是大家应该方法,在ASP.NET自定义控件中只是简单那么定义事件是行不通。如果大家开发的是WinForm中的事件,之前的定义可能没有什么大的问题,只是在效率方法欠考虑而且,还是可以运行的。

  下面我们就回到ASP.NET中的事件。

  大家也许看了我们之前定义的事件,确实,事件一般是那么定义的,但是那样定义事件后的,运行起来的效率不搞,因为那样定义事件后,编译器在编译事件代码的时候,会自动的为我们加入很多多线程安全的代码,就是说,虽然我们只是定义几行代码,大但是编译器为我们做了很多额外的事情,当然,这样代码的运行的效率可想而知。

  在很多的时候,我们自定义控件的事件不是需要考虑多线程安全等问题的,所我们就要改变代码,使其运行的更加好,我们就采用下面的方法:显示的申明事件:

1 
2//其实其实一个辅助的变量,用来做Hashtable中的”键“
3privatestaticobjectValidateCreditCardFormKey=newobject();
4    publiceventValidateCreditCardFormEventHandlerValidateCreditCardForm
5    {
6      add
7      {
8        Events.AddHandler(ValidateCreditCardFormKey,value);
9      }
10      remove
11      {
12        Events.RemoveHandler(ValidateCreditCardFormKey,value);
13      }
14    }
15
16    
17    protectedvoidOnValidateCreditCardForm(ValidateCreditCardFormEventArgsargs)
18    {
19      ValidateCreditCardFormEventHandlerhandler=Events[ValidateCreditCardFormKey]
20                                    asValidateCreditCardFormEventHandler;
21      if(handler!=null)
22        handler(this,args);
23    }
 注意:其实就我们之前定义的事件的代码而言,编译器在在编译我们的代码的时候,也是编译成了上面的形式而且还额外的加上了一些安全的控制代码,这里,我们现在不要编译器生成,而是我们自己写出来,效率就高了。

  还有就是:如果一个事件在事件列表(是一个hashtable)已经注册了,当页面上有两个相同我们自定义控件,我的控件的事件也只是在注册一次,效率也高了。

  到这里一个事件就定义好了。现在做的事情就是要触发事件。即,点击“提交”按钮,就触发。我们先了理解一下流程:

  点击“提交”,整个页面就向服务器提交了,之后就开始了页面的生命周期。

  1.对页面进行解析,将原来页面中的源,如<asp:....></asp>这样的标记解析成相应的html代码,当把页面解析完之后,页面在服务器就是html的样式了。(我这里说的很粗略,没有必要说的那么详细)。

  2.解析后的页面就开始检查,刚才是哪个控件引发的服务器回传,即,是点击了哪个按钮后,整个页面向服务器提交的,我们这里就是那个“提交”按钮。

  3.解析后的页面检查“提交”按钮的name是否和控件(CreditCardForm)的name相同,如果相同。再检查控件 CreditCardForm实现了IPostBackEventHandler接口,如果实现了,就引发我们之前定义的事件。

  这样,我们的控件就和真正的服务器控件没有两样了。(注意:上面的第3点:我们要按钮的name和CreditCardForm的name一样,这里的 name我们无法用自己手动来设置他们的一样,因为CreditCardForm的名字是有页面来设置的,页面将其设置为:this.UniqueID,所以我们只能将按钮的名字设置为this.UniqueID,这样就可以了),所以我们要重写CreditCardForm5的一些属性:
1 protectedoverridestringSubmitButtonName
2    {
3      get
4      {
5        returnthis.UniqueID;
6      }
7    }

  还有,每一次页面提交给服务器后,解析页面的this.UniqueID都不一样。而且,如果在页面中同时有两个CreditCardForm,我们也要保证两个控件的其他控件,如输入框等等的name也不一样,所以要分别重写name。

1protectedoverridestringPaymentMethodListName
2    {
3      get
4      {
5        returnthis.UniqueID+":PaymentMethod";
6      }
7    }
8
9    protectedoverridestringCreditCardNoTextName
10    {
11      get
12      {
13        returnthis.UniqueID+":CreditCardNo";
14      }
15    }
16
17    protectedoverridestringCardholderNameTextName
18    {
19      get
20      {
21        returnthis.UniqueID+":CardholderName";
22      }
23    }
24
25    protectedoverridestringMonthListName
26    {
27      get
28      {
29        returnthis.UniqueID+":Month";
30      }
31    }
32
33    protectedoverridestringYearListName
34    {
35      get
36      {
37        returnthis.UniqueID+":Year";
38      }
39    }
  这里以后,下面我们就只要实现IPostBackEventHandler接口,就可以调用我们的事件了,实现IPostBackEventHandler接口,其实只有一个方法。而且也很简单,代码:

1 
2
3//大家看看我们只是将之前的事件通知代码移到了这里。
4voidIPostBackEventHandler.RaisePostBackEvent(stringargs)
5    {
6      ValidateCreditCardFormEventArgsve=newValidateCreditCardFormEventArgs(
7        PaymentMethodText,CreditCardNoText,CardholderNameText,ExpirationDateText);
8
9      OnValidateCreditCardForm(ve);
10    }

  这样以后,我们的控件就可以引发服务器回传了,即,当你点击“提交”按钮时,我们的浏览器的状态栏下面就有刷新的进度条了。

  注意,还有一个问题啊,我们确实能够使得我们的控件向服务器提交信息,但是服务器怎么来得到我们的提交的信息呢?

  并不是我们把信息向服务器提交后,就什么都不管了,然后服务器就”很听话的“进行验证。不是这样的,起码我们还要告诉服务器,我们提交了哪些要被验证的信息。

  那么服务器这样接受到我们的信息,,很简单,只要实现一个接口就可以了--IPostBackDataHandler。

  接口有两个方法,第一个就是LoadPostData方法,就是来获取我们的信息,并且判断我们这次提交的信息和上次有变化没有。

  上面的方法返回一个布尔的值,如果返回true,就自动的调用下一个方法RaisePostDataChangedEvent,大家可以根据方法的英文看到他们的作用。

  这里我们只是讲下LoadPostData方法,方法的完成写法是这样的:
1boolLoadPostData(stringpostDataKey,NameValueCollectionvalues)
2{
3
4}

  看见方法不要害怕,方法的参数,前一个参数,我们不要管,只要看看后面的参数就可以了。

  我们的信息的提交,都是在相应的输入框,下拉框中写好了,传给服务器的,其实是以:键值对,传了的.

  键:就是我们输入框等的名字,name

  值:就是输入的值。

  其实NameValueCollection就是一个哈希表,来存放键值对的。

  我们之前的所有输入的信息被包含成了一个NameValueCollection传到服务器,然后服务器就通过对应的“键”(name)来获取值,然后验证。

  代码如下:

1 boolIPostBackDataHandler.LoadPostData(stringpostDataKey,NameValueCollectionvalues)
2    {
3      stringpaymentMethod=values[PaymentMethodListName]=="0"?"Master":"Visa";
4      if(paymentMethod!=PaymentMethodText)
5      {
6        PaymentMethod=paymentMethod;
7        hasPaymentMethodChanged=true;
8      }
9
10      stringcreditCardNo=values[CreditCardNoTextName];
11      if(creditCardNo!=CreditCardNoText)
12      {
13        CreditCardNoText=creditCardNo;
14        hasCreditCardNoChanged=true;
15      }
16
17      stringcardholderName=values[CardholderNameTextName];
18      if(cardholderName!=CardholderNameText)
19      {
20        CardholderNameText=cardholderName;
21        hasCardholderNameChanged=true;
22      }
23
24      intmonth=int.Parse(values[MonthListName]);
25      intyear=int.Parse(values[YearListName]);
26      DateTimeexpirationDate=newDateTime(year,month,10);
27      if(expirationDate!=ExpirationDateText)
28      {
29        ExpirationDateText=expirationDate;
30        hasExpirationDateChanged=true;
31      }
32
33
34      if(!string.IsNullOrEmpty(values[SubmitButtonName]))
35        Page.RegisterRequiresRaiseEvent(this);
36
37      returnhasExpirationDateChanged||
38        hasCreditCardNoChanged||
39        hasPaymentMethodChanged||
40        hasCardholderNameChanged;
41
42    }
这样,我们整个控件就写完了,不知道大家懂了没:有问题回复!完整代码如下:

 1usingSystem;
 2usingSystem.Collections.Generic;
 3usingSystem.Text;
 4usingSystem.Web;
 5usingSystem.Web.UI;
 6usingSystem.Web.UI.WebControls;
 7usingSystem.Collections;
 8
 9usingSystem.Collections.Specialized;
10
11namespaceCreditCardForm
12{
13  publicclassCreditCardForm6:CreditCardForm5,IPostBackEventHandler,IPostBackDataHandler
14  {
15    #regionoverridename
16    protectedoverridestringPaymentMethodListName
17    {
18      get
19      {
20        returnthis.UniqueID+":PaymentMethod";
21      }
22    }
23
24    protectedoverridestringCreditCardNoTextName
25    {
26      get
27      {
28        returnthis.UniqueID+":CreditCardNo";
29      }
30    }
31
32    protectedoverridestringCardholderNameTextName
33    {
34      get
35      {
36        returnthis.UniqueID+":CardholderName";
37      }
38    }
39
40    protectedoverridestringMonthListName
41    {
42      get
43      {
44        returnthis.UniqueID+":Month";
45      }
46    }
47
48    protectedoverridestringYearListName
49    {
50      get
51      {
52        returnthis.UniqueID+":Year";
53      }
54    }
55
56    protectedoverridestringSubmitButtonName
57    {
58      get
59      {
60        returnthis.UniqueID;
61      }
62    }
63    #endregion
64    #regionprorerty
65
66    publicstringPaymentMethodText
67    {
68      get
69      {
70        returnViewState["PaymentMethod"]!=null?(string)ViewState["PaymentMethod"]:string.Empty;
71      }
72      set
73      {
74        ViewState["PaymentMethod"]=value;
75      }
76    }
77
78
79    publicstringCreditCardNoText
80    {
81      get
82      {
83        returnViewState["CreditCardNo"]!=null?(string)ViewState["CreditCardNo"]:string.Empty;
84      }
85      set
86      {
87        ViewState["CreditCardNo"]=value;
88      }
89    }
90
91    publicstringCardholderNameText
92    {
93      get
94      {
95        returnViewState["CardholderName"]!=null?(string)ViewState["CardholderName"]:string.Empty;
96      }
97      set
98      {
99        ViewState["CardholderName"]=value;
100      }
101    }
102
103    publicDateTimeExpirationDateText
104    {
105      get
106      {
107        returnViewState["ExpirationDate"]!=null?(DateTime)ViewState["ExpirationDate"]:DateTime.Now;
108      }
109      set
110      {
111        ViewState["ExpirationDate"]=value;
112      }
113    }
114
115
116    #endregion
117
118    #regionevents
119    privatestaticobjectValidateCreditCardFormKey=newobject();
120    publiceventValidateCreditCardFormEventHandlerValidateCreditCardForm
121    {
122      add
123      {
124        Events.AddHandler(ValidateCreditCardFormKey,value);
125      }
126      remove
127      {
128        Events.RemoveHandler(ValidateCreditCardFormKey,value);
129      }
130    }
131
132    
133    protectedvoidOnValidateCreditCardForm(ValidateCreditCardFormEventArgsargs)
134    {
135      ValidateCreditCardFormEventHandlerhandler=Events[ValidateCreditCardFormKey]
136                                    asValidateCreditCardFormEventHandler;
137      if(handler!=null)
138        handler(this,args);
139    }
140
141    #endregion
142    voidIPostBackEventHandler.RaisePostBackEvent(stringargs)
143    {
144      ValidateCreditCardFormEventArgsve=newValidateCreditCardFormEventArgs(
145        PaymentMethodText,CreditCardNoText,CardholderNameText,ExpirationDateText);
146
147      OnValidateCreditCardForm(ve);
148    }
149
150    privateboolhasPaymentMethodChanged;
151    privateboolhasCreditCardNoChanged;
152    privateboolhasCardholderNameChanged;
153    privateboolhasExpirationDateChanged;
154
155    boolIPostBackDataHandler.LoadPostData(stringpostDataKey,NameValueCollectionvalues)
156    {
157      stringpaymentMethod=values[PaymentMethodListName]=="0"?"Master":"Visa";
158      if(paymentMethod!=PaymentMethodText)
159      {
160        PaymentMethod=paymentMethod;
161        hasPaymentMethodChanged=true;
162      }
163
164      stringcreditCardNo=values[CreditCardNoTextName];
165      if(creditCardNo!=CreditCardNoText)
166      {
167        CreditCardNoText=creditCardNo;
168        hasCreditCardNoChanged=true;
169      }
170
171      stringcardholderName=values[CardholderNameTextName];
172      if(cardholderName!=CardholderNameText)
173      {
174        CardholderNameText=cardholderName;
175        hasCardholderNameChanged=true;
176      }
177
178      intmonth=int.Parse(values[MonthListName]);
179      intyear=int.Parse(values[YearListName]);
180      DateTimeexpirationDate=newDateTime(year,month,10);
181      if(expirationDate!=ExpirationDateText)
182      {
183        ExpirationDateText=expirationDate;
184        hasExpirationDateChanged=true;
185      }
186
187
188      if(!string.IsNullOrEmpty(values[SubmitButtonName]))
189        Page.RegisterRequiresRaiseEvent(this);
190
191      returnhasExpirationDateChanged||
192        hasCreditCardNoChanged||
193        hasPaymentMethodChanged||
194        hasCardholderNameChanged;
195
196    }
197
198    voidIPostBackDataHandler.RaisePostDataChangedEvent()
199    {
200      boolhasChanged;
201      hasChanged=hasCardholderNameChanged||
202        hasCreditCardNoChanged||
203        hasPaymentMethodChanged||
204        hasExpirationDateChanged;
205
206      if(hasChanged)
207      {
208
209        ValidateCreditCardFormEventArgsargs=newValidateCreditCardFormEventArgs(
210          PaymentMethod,CreditCardNoText,CardholderNameText,ExpirationDateText);
211
212        OnValidateCreditCardForm(args);
213      }
214    }
215
216  }
217}
218
原创粉丝点击