自己写一个控件继承TextBox,增加一个SubmitControl 属性用来指定此文本框上按回车时由哪个按钮来响应。
再做一个Converter增加设计时支持,就是在设计时可以用下拉框选择提交按钮。
目前只考虑了Button、LinkButton和ImageButton作为提交按钮,当然继承它们的控件也可以。
本例知识点:控件、属性、继承。
继承:是一个进程,通过继承,一个对象可以获得另一个对象的属性(包括函数),并可向其中加入属于自己的一些特征。作为C++语言的一种重要机制,用继承的方法可以自动为一个类提供来自另一个类的操作和数据结构,进而使程序设计人员在一个一般的类的基础上很快建立一个新的类,而不必从零开始设计每个类。
当一个类被其他的类继承时,被继承的类称为基类,又称为父类。
继承其他类属性的类称为派生类,又称为子类。
一般情况下,继承的进程起源于一个基类的定义,基类定义了其所有派生类的公有属性。从本质上讲,基类具有同一类集合中的公共属性,派生类继承了这些属性,并且增加了自己特有的属性。从任何已存在的类继承的实质就是建造新的派生类。
实现过程
1)先创建一个新项目WEB控件库,将此段代码加进去。

Code
1 public class ufoTextBox :TextBox
2 {
3 [TypeConverter(typeof(SubmitableControlConvertor)),DefaultValue(""),Category("Behavior")]
4 public string SubmitControl
5 {
6 get
7 {
8 object ret = this.ViewState["SubmitControl"];
9 if (ret != null)
10 {
11 return (string) ret;
12 }
13 return string.Empty;
14 }
15 set
16 {
17 this.ViewState["SubmitControl"] = value;
18 }
19 }
20 protected override void AddAttributesToRender(HtmlTextWriter writer)
21 {
22 base.AddAttributesToRender(writer);
23 if(this.SubmitControl.Length >0)
24 {
25 Control con = FindControl(SubmitControl);
26 if(con != null)
27 {
28 string script = "if(event.keyCode == 13){document.getElementById('" + con.ClientID + "').click();event.returnValue=false;}";
29 writer.AddAttribute("onkeydown",script);
30 }
31 }
32 }
33 }
34 自定义的Converter,用于设计时支持:
35 public class SubmitableControlConvertor :StringConverter
36 {
37 private object[] GetControls(IContainer container)
38 {
39 ComponentCollection components = container.Components;
40 ArrayList ret = new ArrayList();
41 foreach (IComponent control in components)
42 {
43 if (!(control is Button || control is LinkButton || control is ImageButton))
44 {
45 continue;
46 }
47 Control button = (Control) control;
48 if ((button.ID != null) &&(button.ID.Length != 0))
49 {
50 ret.Add(string.Copy(button.ID));
51 }
52 }
53 ret.Sort(Comparer.Default);
54 return ret.ToArray();
55 }
56 publicoverrideSystem.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
57 {
58 if ((context != null) &&(context.Container != null))
59 {
60 object[] controls = this.GetControls(context.Container);
61 if (controls != null)
62 {
63 return new TypeConverter.StandardValuesCollection(controls);
64 }
65 }
66 return null;
67 }
68 public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
69 {
70 return false;
71 }
72 public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
73 {
74 return true;
75 }
76 } 2)将此文件生成.dll文件,在工具箱中添加此dll文件。
3)将此控件拖入相应页面,在Page_Load中加上[此控件的名字].SubmitControl="所提交的按钮的名字";
例如:
WebCustomControl1.SubmitControl="Button1"(双引号不要去掉了!)
当往WebCustomControl1输入完内容之后按回车Button1响应。