2009-08-21 21 views
5

Potrzebuję wywołać kod po stronie serwera, który zostanie wywołany, gdy pole TextBox zostanie utracone.Zdarzenie ASP.NET TextBox LostFocus

Wiem, że istnieje zdarzenie po stronie klienta onblur i że nie ma zdarzenia LostFocus, więc w jaki sposób mogę spowodować odświeżenie, gdy mój TextBox traci ostrość?

Aktualizacja:

Znalazłem blog który wydaje się dać całkiem przyzwoity rozwiązanie tego. Obejmuje to dodanie niestandardowego zdarzenia do podklasy TextBox i zarejestrowanie skryptu klienta, który wywołuje zdarzenie po stronie serwera w zdarzeniu klienta JavaScript onblur.

Poniżej moja implementacja w 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 

Odpowiedz

3

Znalazłem blog który wydaje się dać całkiem przyzwoity rozwiązanie tego. Obejmuje to dodanie niestandardowego zdarzenia do podklasy TextBox i zarejestrowanie skryptu klienta, który wywołuje zdarzenie po stronie serwera w zdarzeniu klienta JavaScript onblur.

co następuje moja implementacja w 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

Cóż, jest to dość dziwny program, ale można użyć „onblur” po stronie klienta, aby zadzwonić „form.submit();”.

+0

nie spróbować tego jak muszę wiedzieć, co kontrola traci ostrość –

-1

Dlaczego nie używasz pola tekstowego asp z ustawieniem właściwości AutoPostBack na wartość true.

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

Nawet AutoPostBack wartość true, nadal nie ma na wydarzenie LostFocus TextBox –

2

Dzięki za to, że działa jak czar. Jedna rzecz, którą musisz zmienić: zawiń wartość UniqueID przekazaną do funkcji OnBlurred w cudzysłowach, więc jest używana jako ciąg znaków, a nie jako instancja kontrolna. Czyli:

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

staje:

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

Dziękuję za to, zaktualizowałem swoją odpowiedź komentarzem –