Событие ASP.NET TextBox LostFocus

Мне нужно вызвать код на стороне сервера, который будет вызываться, когда TextBox теряет фокус.

Я знаю, что есть событие на стороне клиента onblur и что нет события LostFocus, так как я могу вызвать обратную передачу, когда мой TextBox теряет фокус?

Обновление:

Я нашел blog, который, кажется, дает довольно приличное решение этой проблемы. Это включает в себя добавление пользовательского события в подкласс TextBox и регистрацию клиентского скрипта, который вызывает событие на стороне сервера в клиентском событии onblur JavaScript.

Ниже приведена моя реализация в 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

person Patrick McDonald    schedule 21.08.2009    source источник


Ответы (4)


Я нашел blog, который, кажется, дает довольно приличное решение этой проблемы. Это включает в себя добавление пользовательского события в подкласс TextBox и регистрацию клиентского скрипта, который вызывает событие на стороне сервера в клиентском событии onblur JavaScript.

Ниже приведена моя реализация в 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
person Patrick McDonald    schedule 21.08.2009

Спасибо за это, это работает как шарм. Единственное, что вам нужно изменить: заключить значение UniqueID, переданное в функцию OnBlurred, в кавычки, чтобы оно использовалось как строка, а не как экземпляр элемента управления. Это:

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

становится:

Attributes.Add("onblur", "OnBlurred('" & UniqueID & "','')") 
person PjL    schedule 20.02.2010

Что ж, это довольно странный план, но вы можете использовать onblur на стороне клиента для вызова form.submit();.

person Noon Silk    schedule 21.08.2009
comment
Я не пробовал это, так как мне нужно знать, какой контроль потерял фокус - person Patrick McDonald; 21.08.2009

Почему бы вам не использовать текстовое поле asp со свойством AutoPostBack, для которого установлено значение true.

<asp:TextBox ID="TextBox1" runat="server" AutoPostBack="True"></asp:TextBox>
person rahul    schedule 21.08.2009
comment
Даже если для AutoPostBack установлено значение true, в TextBox по-прежнему нет события LostFocus. - person Patrick McDonald; 21.08.2009