解决 ASP.NET 中文本框上按回车时系统缺省提交按钮的问题
ASP.NET 中由于一个页面只有 Form ,经常碰到的一个问题是当在一个文本框中按回车后确不知哪个按钮被当成提交按钮提交了,非常郁闷!!!特别是在有用户控件时,搞得都不敢用 Validator 。
今天实在任不住把它搞定,其实也不麻烦。
基本思路:
自己写一个控件继承 TextBox,增加一个 SubmitControl 属性用来指定此文本框上按回车时由哪个按钮来响应。
再做一个 Converter 增加设计时支持,就是在设计时可以用下拉框选择提交按钮。
目前只考虑了 Button、LinkButton和ImageButton作为提交按钮,当然继承它们的控件也可以。
代码很少,就直接贴在这儿了。
ufoTextBox 控件:
自定义的 Converter,用于设计时支持:
没几行代码,自己看吧。
今天实在任不住把它搞定,其实也不麻烦。
基本思路:
自己写一个控件继承 TextBox,增加一个 SubmitControl 属性用来指定此文本框上按回车时由哪个按钮来响应。
再做一个 Converter 增加设计时支持,就是在设计时可以用下拉框选择提交按钮。
目前只考虑了 Button、LinkButton和ImageButton作为提交按钮,当然继承它们的控件也可以。
代码很少,就直接贴在这儿了。
ufoTextBox 控件:
public class ufoTextBox : TextBox
{
[TypeConverter(typeof(SubmitableControlConvertor)), DefaultValue(""),Category("Behavior")]
public string SubmitControl
{
get
{
object ret = this.ViewState["SubmitControl"];
if (ret != null)
{
return (string) ret;
}
return string.Empty;
}
set
{
this.ViewState["SubmitControl"] = value;
}
}
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
base.AddAttributesToRender(writer);
if(this.SubmitControl.Length > 0)
{
Control con = FindControl(SubmitControl);
if(con != null)
{
string script = "if(event.keyCode == 13){document.getElementById('" + con.ClientID + "').click();event.returnValue=false;}";
writer.AddAttribute("onkeydown",script);
}
}
}
}
{
[TypeConverter(typeof(SubmitableControlConvertor)), DefaultValue(""),Category("Behavior")]
public string SubmitControl
{
get
{
object ret = this.ViewState["SubmitControl"];
if (ret != null)
{
return (string) ret;
}
return string.Empty;
}
set
{
this.ViewState["SubmitControl"] = value;
}
}
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
base.AddAttributesToRender(writer);
if(this.SubmitControl.Length > 0)
{
Control con = FindControl(SubmitControl);
if(con != null)
{
string script = "if(event.keyCode == 13){document.getElementById('" + con.ClientID + "').click();event.returnValue=false;}";
writer.AddAttribute("onkeydown",script);
}
}
}
}
自定义的 Converter,用于设计时支持:
public class SubmitableControlConvertor : StringConverter
{
private object[] GetControls(IContainer container)
{
ComponentCollection components = container.Components;
ArrayList ret = new ArrayList();
foreach (IComponent control in components)
{
if (!(control is Button || control is LinkButton || control is ImageButton))
{
continue;
}
Control button = (Control) control;
if ((button.ID != null) && (button.ID.Length != 0))
{
ret.Add(string.Copy(button.ID));
}
}
ret.Sort(Comparer.Default);
return ret.ToArray();
}
public override System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if ((context != null) && (context.Container != null))
{
object[] controls = this.GetControls(context.Container);
if (controls != null)
{
return new TypeConverter.StandardValuesCollection(controls);
}
}
return null;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return false;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
}
{
private object[] GetControls(IContainer container)
{
ComponentCollection components = container.Components;
ArrayList ret = new ArrayList();
foreach (IComponent control in components)
{
if (!(control is Button || control is LinkButton || control is ImageButton))
{
continue;
}
Control button = (Control) control;
if ((button.ID != null) && (button.ID.Length != 0))
{
ret.Add(string.Copy(button.ID));
}
}
ret.Sort(Comparer.Default);
return ret.ToArray();
}
public override System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if ((context != null) && (context.Container != null))
{
object[] controls = this.GetControls(context.Container);
if (controls != null)
{
return new TypeConverter.StandardValuesCollection(controls);
}
}
return null;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return false;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
}
没几行代码,自己看吧。