解决 ASP.NET 中文本框上按回车时系统缺省提交按钮的问题

ASP.NET 中由于一个页面只有 Form ,经常碰到的一个问题是当在一个文本框中按回车后确不知哪个按钮被当成提交按钮提交了,非常郁闷!!!特别是在有用户控件时,搞得都不敢用 Validator 。 今天实在任不住把它搞定,其实也不麻烦。 基本思路: 自己写一个控件继承 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); } } } } 自定义的 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; } } 没几行代码,自己看吧。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值