2009-08-21 18 views
5

Devo attivare il codice sul lato server per essere chiamato quando un TextBox perde lo stato attivo.ASP.NET TextBox LostFocus event

So che c'è l'evento lato client onblur e che non c'è alcun evento LostFocus, quindi come posso causare un postback quando si verifica che il mio TextBox perda l'attenzione?

Aggiornamento:

ho trovato un blog che sembra dare una soluzione abbastanza decente a questo. Implica l'aggiunta di un evento personalizzato a una sottoclasse TextBox e la registrazione di uno script client che richiama l'evento lato server nell'evento client JavaScript onblur.

Quello che segue è la mia applicazione in VB:

Public Class MyTextBox 
    Inherits TextBox 
    Implements IPostBackEventHandler 

    Protected Overrides Sub OnInit(ByVal e As System.EventArgs) 
     MyBase.OnInit(e) 
     If Not Page.ClientScript.IsClientScriptBlockRegistered("OnBlurTextBoxEvent") Then 
      Page.ClientScript.RegisterStartupScript(MyBase.GetType, "OnBlurTextBoxEvent", GetScript, True) 
      Attributes.Add("onblur", "OnBlurred('" & UniqueID & "','')") 
     End If 
    End Sub 

    Public Delegate Sub OnBlurDelegate(ByVal sender As Object, ByVal e As EventArgs) 

    Public Event Blur As OnBlurDelegate 

    Protected Sub OnBlur() 
     RaiseEvent Blur(Me, EventArgs.Empty) 
    End Sub 

    Private Function GetScript() As String 
     Return "function OnBlurred(control, arg)" & vbCrLf & _ 
       "{" & vbCrLf & _ 
       " __doPostBack(control, arg);" & vbCrLf & _ 
       "}" 
    End Function 

    Public Sub RaisePostBackEvent(ByVal eventArgument As String) Implements System.Web.UI.IPostBackEventHandler.RaisePostBackEvent 
     OnBlur() 
    End Sub 
End Class 

risposta

3

ho trovato un blog che sembra dare una soluzione abbastanza decente a questo. Implica l'aggiunta di un evento personalizzato a una sottoclasse TextBox e la registrazione di uno script client che richiama l'evento lato server nell'evento client JavaScript onblur.

Quanto segue è la mia applicazione in VB:

Public Class MyTextBox 
    Inherits TextBox 
    Implements IPostBackEventHandler 

    Protected Overrides Sub OnInit(ByVal e As System.EventArgs) 
     MyBase.OnInit(e) 
     If Not Page.ClientScript.IsClientScriptBlockRegistered("OnBlurTextBoxEvent") Then 
      Page.ClientScript.RegisterStartupScript(MyBase.GetType, "OnBlurTextBoxEvent", GetScript, True) 
      Attributes.Add("onblur", "OnBlurred('" & UniqueID & "','')") 
     End If 
    End Sub 

    Public Delegate Sub OnBlurDelegate(ByVal sender As Object, ByVal e As EventArgs) 

    Public Event Blur As OnBlurDelegate 

    Protected Sub OnBlur() 
     RaiseEvent Blur(Me, EventArgs.Empty) 
    End Sub 

    Private Function GetScript() As String 
     Return "function OnBlurred(control, arg)" & vbCrLf & _ 
       "{" & vbCrLf & _ 
       " __doPostBack(control, arg);" & vbCrLf & _ 
       "}" 
    End Function 

    Public Sub RaisePostBackEvent(ByVal eventArgument As String) Implements System.Web.UI.IPostBackEventHandler.RaisePostBackEvent 
     OnBlur() 
    End Sub 
End Class 
0

Beh, è ​​un piano abbastanza strano, ma è possibile utilizzare 'onblur' sul lato client di chiamare 'form.submit();'.

+0

non ho provato questo come ho bisogno di sapere che cosa ha perso il controllo della messa a fuoco –

-1

Perché non si utilizza la casella di testo asp con la proprietà AutoPostBack impostata su true.

<asp:TextBox ID="TextBox1" runat="server" AutoPostBack="True"></asp:TextBox> 
+1

Anche con AutoPostBack impostata su true, non c'è ancora evento LostFocus sul TextBox –

2

Grazie per questo, funziona come un fascino. Solo una cosa che devi modificare: racchiudi il valore UniqueID passato alla funzione OnBlurred tra virgolette, quindi viene utilizzato come stringa e non come istanza di controllo. Cioè:

Attributes.Add("onblur", "OnBlurred(" & UniqueID & ",'')") 

diventa:

Attributes.Add("onblur", "OnBlurred('" & UniqueID & "','')") 
+0

Grazie per questo, ho aggiornato la mia risposta con il tuo commento –