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">
...
Pero aquí lo que buscamos es tener mas de un botón...y no uno general (y por que no incluso un DefaultControl...! lo dejo para pensar)
La idea es algo así... que dependiendo en que Textbox estoy presionando ENTER se realiza el postback de un botón determinado
Hoy encontré en este articulo, interesante para la ultima opción
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 defecto
La 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
Comparte este post: