http://www.chinaitz.com/html/2009/0307/398751.html
我们上一篇已经开发一个登录的组合控件,但是我们把控件的事件的这个问题没有解决,现在我们就来看看这个问题。
因为我们的组合控件Login是由一些已经存在的服务器控件的组合的,这样就省却了我们很多的麻烦,上篇中我们已经把子控件的一些属性,如Text等,显示呈现为了组合控件的属性。我们将之称为“属性的冒泡”(我自己这样认为的)。
我们现在来想下:其实我们点击“提交”按钮,我们就想把控件中信息发送给服务器,然后验证。即,我们点击的是“提交”按钮,但是触发的确实Login控件的验证事件。也就是说,我们应该把子控件-button的事件,上升冒泡成为Login的事件。
现在我们就正式讲讲怎么来事件冒泡。
对于事件的一些步骤,大家应该还记得:
1。定义一个数据类,用来当发生事件时,我们把一些信息携带。在本控件中,当我们点击“提交”按钮时,我们就把用户名和密码作为数据送到服务器。所以我们的数据类包含两个信息:如下:
1publicclassValidateEventArgs:EventArgs
2 {
3 privatestringuserName;
4 privatestringuserPassward;
5
6 publicstringUserName
7 {
8 get
9 {
10 return userName;
11 }
12 }
13
14 publicstringUserPassward
15 {
16 get
17 {
18 returnuserPassward;
19 }
20 }
21
22 publicValidateEventArgs(stringusername,stringuserpassward)
23 {
24 this.userName=username;
25 this.userPassward=userpassward;
26 }
27 }
相信大家对上面的代码不陌生!!!
2.我们来定义一个委托:
1publicdelegatevoidValidateEventHandler(objectsender,ValidateEventArgsargs);
3.定义事件。
1 privatestaticreadonlyobjectValidateEventKey=newobject();
2 publiceventValidateEventHandlerValidateUserInfoChanged
3 {
4 add
5 {
6 Events.AddHandler(ValidateEventKey,value);
7 }
8 remove
9 {
10 Events.RemoveHandler(ValidateEventKey,value);
11 }
12 }
13
14 protectedvirtualvoidOnValidateChanged(ValidateEventArgsargs)
15 {
16 ValidateEventHandlerhandler=Events[ValidateEventKey]asValidateEventHandler;
17 if(handler!=null)
18 handler(this,args);
19 }
20
4.好了;准备都做好了,下面我们只要把这个事件冒泡成为Login的控件的就行了。其实很简单的。只要重写一个方法就行了。
如下:
1protectedoverrideboolOnBubbleEvent(objectsource,EventArgsargs)
2 {
3 boolhandled=false;
4
5 CommandEventArgsce=argsasCommandEventArgs;
6 if(ce!=null&&ce.CommandName=="Validate")
7 {
8 handled=true;
9 stringuserName=this.txtUserName.Text;
10 stringuserPassward=this.txtUserPassward.Text;
11
12 //把信息输入
13 ValidateEventArgsve=newValidateEventArgs(userName,userPassward);
14 OnValidateChanged(ve);
15 }
16 returnhandled;
17 }
好了,完了,就这样了。
完整代码附上:
1usingSystem;
2usingSystem.Collections.Generic;
3usingSystem.Text;
4usingSystem.Web;
5usingSystem.Web.UI;
6usingSystem.Web.UI.WebControls;
7usingSystem.ComponentModel;
8
9namespaceLoginControl
10{
11 publicclassLogin:CompositeControl
12 {
13 #region要组合的控件
14 LabellbUserName;
15 LabellbUserPassward;
16 TextBoxtxtUserName;
17 TextBoxtxtUserPassward;
18 ButtonsubmitButton;
19 #endregion
20
21
22 #region重写方法CreateChildControls
23
24 protectedoverridevoidCreateChildControls()
25 {
26 Controls.Clear();
27
28 //初始化控件lbUserName
29 lbUserName=newLabel();
30 lbUserName.Text="用户名:";
31 lbUserName.ID="lbUserName";
32 //把控件添加到我们的组合控件中
33 Controls.Add(lbUserName);
34
35 //初始化控件lbUserPassward
36 lbUserPassward=newLabel();
37 lbUserPassward.Text="密 码:";
38 lbUserPassward.ID="lbUserPassward";
39 Controls.Add(lbUserPassward);
40
41
42 txtUserName=newTextBox();
43 txtUserName.ID="txtUserName";
44 txtUserName.Width=Unit.Percentage(60);
45 Controls.Add(txtUserName);
46
47 txtUserPassward=newTextBox();
48 txtUserPassward.ID="txtUserPassward";
49 txtUserPassward.Width=Unit.Percentage(60);
50 Controls.Add(txtUserPassward);
51
52 submitButton =newButton();
53 submitButton.Text="提交";
54 submitButton.CommandName="Validate";
55 Controls.Add(submitButton);
56
57 ChildControlsCreated=true;
58 }
59 #endregion
60 #region将组合的子控件的属性呈现为组合控件的属性
61
62 publicstringUserNameLabelText
63 {
64 get
65 {
66 EnsureChildControls();
67 returnlbUserName.Text;
68 }
69 set
70 {
71 EnsureChildControls();
72 lbUserName.Text=value;
73 }
74 }
75
76 publicstringUserPasswardLabelText
77 {
78 get
79 {
80 EnsureChildControls();
81 returnlbUserPassward.Text;
82 }
83 set
84 {
85 EnsureChildControls();
86 lbUserPassward.Text=value;
87 }
88 }
89
90 publicstringSubmitButtonText
91 {
92 get
93 {
94 EnsureChildControls();
95 returnsubmitButton.Text;
96 }
97 set
98 {
99 EnsureChildControls();
100 submitButton.Text =value;
101 }
102 }
103
104
105 #endregion
106
107 #region组合控件呈现的样式
108 protectedoverrideHtmlTextWriterTagTagKey
109 {
110 get
111 {
112 returnHtmlTextWriterTag.Table;
113 }
114 }
115
116 protectedoverridevoidRenderContents(HtmlTextWriterwriter)
117 {
118
119 writer.RenderBeginTag(HtmlTextWriterTag.Tr);
120
121 writer.RenderBeginTag(HtmlTextWriterTag.Td);
122 lbUserName.RenderControl(writer);
123 writer.RenderEndTag();//td的结束
124
125 writer.RenderBeginTag(HtmlTextWriterTag.Td);
126 txtUserName.RenderControl(writer);
127 writer.RenderEndTag();
128
129 writer.RenderEndTag();//tr的结束
130
131 //***********************************************
132
133 writer.RenderBeginTag(HtmlTextWriterTag.Tr);
134
135 writer.RenderBeginTag(HtmlTextWriterTag.Td);
136 lbUserPassward.RenderControl(writer);
137 writer.RenderEndTag();//td的结束
138
139 writer.RenderBeginTag(HtmlTextWriterTag.Td);
140 txtUserPassward.RenderControl(writer);
141 writer.RenderEndTag();
142
143 writer.RenderEndTag();//tr的结束
144
145 //***********************************************
146
147 writer.RenderBeginTag(HtmlTextWriterTag.Tr);
148
149 writer.AddAttribute(HtmlTextWriterAttribute.Colspan,"2");
150 writer.AddAttribute(HtmlTextWriterAttribute.Align,"center");
151 writer.RenderBeginTag(HtmlTextWriterTag.Td);
152 submitButton.RenderControl(writer);
153 writer.RenderEndTag();
154
155 writer.RenderEndTag();//tr的结束
156
157
158
159
160 }
161 #endregion
162
163 #region事件
164 privatestaticreadonlyobjectValidateEventKey=newobject();
165 publiceventValidateEventHandlerValidateUserInfoChanged
166 {
167 add
168 {
169 Events.AddHandler(ValidateEventKey,value);
170 }
171 remove
172 {
173 Events.RemoveHandler(ValidateEventKey,value);
174 }
175 }
176
177 protectedvirtualvoidOnValidateChanged(ValidateEventArgsargs)
178 {
179 ValidateEventHandlerhandler=Events[ValidateEventKey]asValidateEventHandler;
180 if(handler!=null)
181 handler(this,args);
182 }
183
184 #endregion
185
186 #region冒泡
187
188 protectedoverrideboolOnBubbleEvent(objectsource,EventArgsargs)
189 {
190 boolhandled=false;
191
192 CommandEventArgsce=argsasCommandEventArgs;
193 if(ce!=null&&ce.CommandName=="Validate")
194 {
195 handled=true;
196 stringuserName=this.txtUserName.Text;
197 stringuserPassward=this.txtUserPassward.Text;
198
199 //把信息输入
200 ValidateEventArgsve=newValidateEventArgs(userName,userPassward);
201 OnValidateChanged(ve);
202 }
203 returnhandled;
204 }
205 #endregion
206
207
208
209 }
210}
211