En una pregunta de hoy en los foros de MSDN el tema era como tener mas de un DefaultButton por formulario, ya que queria que en un UserControl de Busqueda sea un boton el que se ejecute al presionar Enter sobre el texbox de busqueda, y tambien otra parte de la pagina funcione similarmente pero con otros controles.
Para refrescar la memoria podemos decir que por formulario en paginas ASP.NET podemos tener un DefaultButton, algo así:
<body> <form id="Form1" defaultbutton="Boton1" defaultfocus="TextBox1" runat="server"> ...
La idea es algo así… que dependiendo en que Textbox estoy presionando ENTER se realiza el postback de un botón determinado
- Submitting default buttons when the user presses the Enter key – finally!
http://codebetter.com/blogs/darrell.norton/archive/2004/03/03/8374.aspx
OPCION 1: Simple JS
EJEMPLO 1.1
Los controles:
<asp:TextBox ID="txtBusqueda" runat="server" /> <asp:Button id="btnBusqueda" runat="server" />En el codebehind:
txtBusqueda.Attributes.add("onkeypress", "PresionTeclaBusqueda();")El JS:
<script type="text/javascript"> function PresionTeclaBusqueda(){ if (event.keyCode==13){ document.getElementById('<%=btnBusqueda.ClientId%>').click(); } } </script>
EJEMPLO 1.2
Algo mas general seria enviar el ID del botón a realizar el click:
txtBusqueda.Attributes.add("onkeypress", "ClickBoton('" & btnBusqueda.ClientId & "');")
El código de script del lado del cliente<script type="text/javascript"> function ClickBoton(botonId){ if (event.keyCode==13){ document.getElementById(botonId).click(); } } </script>
OPCION 2: Función para asignar botón por defecto al un control
Como ya comente mas arriba, aqui encontre una funcion muy sencilla, general y mas completa que la opcion 1.
Es un método que escribe en la pagina un script (si ya no esta registrado, para no escribirlo dos veces), y asigna un boton por defectoLa idea es enviarle a cada control su «boton por defecto»
SetDefaultButton(Me.Page, TextBox1, Button1) SetDefaultButton(Me.Page, TextBox2, Button2) SetDefaultButton(Me.Page, TextBox3, Button3)Aquí el código en VB.NET para ASP.NET 2.0 (en el articulo original es para C#, y para ASP.NET 1.1)
Private Sub SetDefaultButton(ByVal pagina As Page, ByVal textControl As TextBox, ByVal botonPorDefecto As Button) 'Armando script Dim script As New Text.StringBuilder script.Append("<SCRIPT language=""javascript"" type=""text/javascript"">" & vbCrLf) script.Append("<!--" & vbCrLf) script.Append("function fnTrapKD(btn, event){" & vbCrLf) script.Append("" & vbCrLf) script.Append(" if (document.all){" & vbCrLf) script.Append(" if (event.keyCode == 13){" & vbCrLf) script.Append(" event.returnValue=false;" & vbCrLf) script.Append(" event.cancel = true;" & vbCrLf) script.Append(" btn.click();" & vbCrLf) script.Append(" }" & vbCrLf) script.Append(" }" & vbCrLf) script.Append("" & vbCrLf) script.Append(" else if (document.getElementById){" & vbCrLf) script.Append(" if (event.which == 13){" & vbCrLf) script.Append(" event.returnValue=false;" & vbCrLf) script.Append(" event.cancel = true;" & vbCrLf) script.Append(" btn.click();" & vbCrLf) script.Append(" }" & vbCrLf) script.Append(" }" & vbCrLf) script.Append("" & vbCrLf) script.Append(" else if(document.layers){" & vbCrLf) script.Append(" if(event.which == 13){" & vbCrLf) script.Append(" event.returnValue=false;" & vbCrLf) script.Append(" event.cancel = true;" & vbCrLf) script.Append(" btn.click();" & vbCrLf) script.Append(" }" & vbCrLf) script.Append(" }" & vbCrLf) script.Append("}" & vbCrLf) script.Append("// -->" & vbCrLf) script.Append("</SCRIPT>" & vbCrLf) 'Registrando script pagina.ClientScript.RegisterStartupScript(pagina.GetType(), "FUNCIONBOTONDEFECTO", script.ToString) 'Asignando evento funcion al evento onkeydown textControl.Attributes.Add("onkeydown", "fnTrapKD(" + botonPorDefecto.ClientID + ",event)") End Sub
Aquí la AppWeb con la opcion 2
Enlaces
- HtmlForm.DefaultButton (Propiedad)
Obtiene o establece el control secundario del control HtmlForm que origina la devolución de datos cuando se presiona la tecla ENTRAR. - Submitting default buttons when the user presses the Enter key – finally!
http://codebetter.com/blogs/darrell.norton/archive/2004/03/03/8374.aspx
ESTUPENDO!
Muchas gracias!!!
Como asignar un DefaultButton para un formulario de Login que se encuentra en un layout con MasterPages