Definire un button di default per WebForm ASP.NET

di Andrea Zani, in UserScript, ASP.NET, Web Form,

Una delle grandi sorprese che incontra un programmatore ASP.NET nella realizzazione delle proprie pagine è l'individuazione del button, in presenza di control di questo tipo della pagina, il cui evento sarà attivato una volta che l'utente preme il pulsante "invio" in una maschera per l'inserimento dati.
Un esempio sotto gli occhi di tutti è il form di ricerca nel sito o tra i messaggi del forum nella home-page del sito http://www.asp.net. Una volta inserito il testo da cercare e premuto "invio", viene eseguito un postback della pagina senza alcuna ricerca, perchè sarà avviata solo dopo aver cliccato sul linkButton corrispondente.

Con il codice seguente possiamo definire per ogni textbox inserita nella nostra pagina un button di default. Questo ci permette di avere più maschere di ricerca in una pagina ed essere sicuri che anche se l'utente non clicca direttamente sul button apposito, sarà avviato l'evento appropriato.

Per ottenere questo comportamento è sufficiente utilizzare la funzione "SetButton", funzione che possiamo inserire in una classe della nostra webapplication o dove più ci è comodo.

<%@ Page language="vb" %>
<script runat="server">
sub Page_Load()
  SetButton(txt1,but1)
  SetButton(txt2,but2)
  SetButton(txt3,but3)
end sub

sub Button1Event(sender As Object, e As System.EventArgs)
  msg.Text="Premuto 'Button1', valore del txt1: "+txt1.Text
end sub

sub Button2Event(sender As Object, e As System.EventArgs)
  msg.Text="Premuto 'Button2', valore del txt2: "+txt2.Text
end sub

sub Button3Event(sender As Object, e As System.EventArgs)
  msg.Text="Premuto 'Button3', valore del txt3: "+txt3.Text
end sub

sub SetButton(txt as TextBox,btn as Button)
  dim formName as string
  dim c as Control= btn.Parent
  while(not (typeof c is System.Web.UI.HtmlControls.HtmlForm))
    c=c.Parent
  end while

  if typeof c is System.Web.UI.HtmlControls.HtmlForm then
    formName = c.ClientID
  else
    formName = "forms[0]"
  end if

  dim jsString as string
  jsString= "if ((event.which && event.which == 13) || (event.keyCode && event.keyCode == 13)) {document."+formName+".elements['"+btn.UniqueID+'].click();return false;} else return true; "
  txt.Attributes.Add("onkeydown",jsString)
end sub
</script>
<html><body>
<form runat="server">
<asp:textbox id="txt1" runat="server" />
<asp:button id="but1" runat="server" text="Button1" onclick="Button1Event" /><br />
<asp:textbox id="txt2" runat="server" />
<asp:button id="but2" runat="server" text="Button2" onclick="Button2Event" /><br />
<asp:textbox id="txt3" runat="server" />
<asp:button id="but3" runat="server" text="Button3" onclick="Button3Event" /><br />
<asp:label id="msg" runat="server" />
</form>
</body></html>

Questa tecnica non funziona con Netscape versione 4.0.
Questo codice è un perfezionamento, per renderlo cross-browser, di una tecnica descritta dal programmatore tedesco Janus Kamp Hansen descritta su http://www.kamp-hansen.dk/

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi