Varios DefaultButton para un mismo formulario web

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
image
 
 
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

2 comentarios en “Varios DefaultButton para un mismo formulario web”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *