由于asp.net里面的button都是submit类型的,所以在表单内按回车都是触发的第一个按钮的click事件,如果有多个button则无法在回车的时候触发后面的按钮事件。以下方案可通过设置来改变页面的默认按钮。
方案一
1.在基页面内的load事件里加入supportDefaultButton()
2.基页面中声明变量:
Protected DefaultButton As Button
3.在基页面中加入函数supportDefaultButton并重载RaisePostBackEvent
Private Sub supportDefaultButton()Sub supportDefaultButton() GetPostBackEventReference(New System.Web.UI.Control) RegisterStartupScript("DefaultButton", "") End Sub
Protected Overloads Overrides Sub RaisePostBackEvent()Sub RaisePostBackEvent(ByVal sourceControl As System.Web.UI.IPostBackEventHandler, ByVal eventArgument As String) If (DefaultButton Is Nothing OrElse Request("__EVENTTARGET") <> "") Then MyBase.RaisePostBackEvent(sourceControl, eventArgument) ElseIf (Not DefaultButton Is Nothing) Then MyBase.RaisePostBackEvent(DirectCast(DefaultButton, System.Web.UI.IPostBackEventHandler), Nothing) End If End Sub
|
4.DefaultButton.js文件内容:
for(i=0;i{ if(Form1.elements[i].type == "submit") { fstsubmit = Form1.elements[i] fstsubmit.attachEvent("onmouseup", changeEvent) //break; 这一句应该去掉 } } function changeEvent() { __doPostBack(event.srcElement.id, '') }
|
在继承页面的load事件里:
5.DefaultButton = 需要设置为默认按钮的对象名称
即可。
IE6里面测试通过,低版本没有测试,但应该没问题。
方案二
把我解决方案给大家看看
/// /// 设置在页面回车时触发事件的控件 /// /// 将触发事件的控件对象 public static void SetEnterControl(System.Web.UI.Control Ctrl) { Page mPage = Ctrl.Page; string mScript; mScript = @""; if(!mPage.IsClientScriptBlockRegistered("SetEnterControl")) mPage.RegisterClientScriptBlock("SetEnterControl",mScript); }
|
方案三
how about following, :-)
编译成动态链接库,然后直接往Form设计器一拖就好了。
public class DefaultButton : System.Web.UI.WebControls.Button { protected override void OnPreRender(System.EventArgs e) { base.OnPreRender(e); this.Page.RegisterStartupScript("event_handler", "");
this.Page.RegisterClientScriptBlock("default_button", "" ); } }
|
方案四
解决 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; } }
|
没几行代码,自己看吧。 本文作者:佚名 来源:本站原创
CIO之家 www.ciozj.com 微信公众号:imciow