首页  ·  知识 ·  云计算
asp.net设置默认按钮的有效方法
佚名  本站原创  综合  编辑:dezai  图片来源:网络
由于asp.net里面的button都是submit类型的,所以在表单内按回车都是触发的第一个按钮的click事件,如果有多个button则无法在回车的时候触发后面的按钮事件。

由于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
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读