构建组合控件,顾名思义就是利用已有的控件来重新组合成新的控件。
所有的ASP.NET 控件都有Controls属性来表示它的所有子控件。构建组合控件从CompositeControl类派生,一般会重写CreateChildControls()方法。
下面示例代码演示了组合一个TextBox控件和RequiredFieldValidator控件。
Code
1 using System;
2 using System.Web.UI.WebControls;
3
4 namespace myControls
5 {
6 public class RequiredTextBox : CompositeControl
7 {
8 private TextBox input;
9 private RequiredFieldValidator validator;
10
11 public string Text
12 {
13 get
14 {
15 EnsureChildControls();
16 return input.Text;
17 }
18 set
19 {
20 EnsureChildControls();
21 input.Text = value;
22 }
23 }
24
25 protected override void CreateChildControls()
26 {
27 input = new TextBox();
28 input.ID = "input";
29 this.Controls.Add(input);
30
31 validator = new RequiredFieldValidator();
32 validator.ID = "valInput";
33 validator.ControlToValidate = input.ID;
34 validator.ErrorMessage = "(Required)";
35 validator.Display = ValidatorDisplay.Dynamic;
36 this.Controls.Add(validator);
37 }
38 }
39 }
里面没有重写基类的RenderContens方法而是重写了CreateChildControls方法,注意在Text属性的Get和Set方法都调用了EnsureChildControls()方法,该方法是确保能CreateChildControls()方法,但不会重复调用。因为没有调用CreateChildControls()方法就使用input.Text的话就会造成空引用的异常。必须先创建了子控件才能访问子控件的任何属性,这是毫无疑问的。