如何在TextBox上实现TextChanging属性?

时间:2012-02-06 20:08:35

标签: vb.net events textbox

我认为会有这样的问题,但我没有任何运气搜索。我看到一个问题,有人问同样的事情,但答案是使用TextChanged事件。这不是我想要的。

TextBox有一个TextChanged事件,它发生在Text属性更改之后。在实际更改Text属性以验证数据之前,我需要我的控件来引发事件。如果有效则可以更改文本,如果无效,则文本不会更改。

这是我试过的:

Public Class TextChangingEventArgs
  Inherits System.ComponentModel.CancelEventArgs

  Private p_sNewValue As String 

  Public Sub New()
    p_sNewValue = String.Empty
  End Sub

  Public Sub New(sNewValue As String)
    p_sNewValue = sNewValue
  End Sub

  Public Property NewValue As String
    Get
      Return p_sNewValue
    End Get
    Set(value As String)
      p_sNewValue = value
    End Set
  End Property
End Class

Public Class BetterTextBox
  Inherits TextBox

  Public Event TextChanging(sender As Object, e As TextChangingEventArgs)

  Public Overrides Property Text As String
    Get
      Return MyBase.Text
    End Get
    Set(value As String)
      Dim e As New TextChangingEventArgs(value)
      RaiseEvent TextChanging(Me, e)
      If e.Cancel = False Then
        MyBase.Text = value
      End If
    End Set
  End Property 
End Class

我在我的表单中处理TextChanging事件:

Private Sub BetterTextBox1_TextChanging(sender As System.Object, e As TextChangingEventArgs) Handles BetterTextBox1.TextChanging
  e.Cancel = Not Regex.IsMatch(e.NewValue, REGEX_PATTERN)
End Sub

这适用于以编程方式设置BetterTextBox控件的Text值,但是当您在文本框中键入时它不起作用。

有谁知道我需要做些什么才能让它发挥作用?

4 个答案:

答案 0 :(得分:2)

由于您已经从TextBox继承,因此可以覆盖WndProc并检查粘贴消息。这应解决右键单击>粘贴问题。然后,您可以像其他人所建议的那样处理KeyPressed或KeyDown中的“常规”类型文本。 这是我正在谈论的一个例子:

Private Const WM_PASTE As Integer = &H302
Protected Overrides Sub WndProc(ByRef m As Message)
    If m.Msg = WM_PASTE AndAlso Clipboard.ContainsText() AndAlso ShouldAllowPaste(Clipboard.GetText()) Then
        MyBase.WndProc(m)
    ElseIf m.Msg <> WM_PASTE Then
        MyBase.WndProc(m)
    End If
End Sub

答案 1 :(得分:1)

试试这个:

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    If m.Msg = 8465 Then
        If HIWORD(m.WParam) = 1024 Then
            ' raise your TextChanging event
        End If
    End If

    MyBase.WndProc(m)
End Sub

Public Function HIWORD(ByVal n As Integer) As UInteger
    Return CUInt(n >> 16) And CUInt(&HFFFF)
End Function

答案 2 :(得分:0)

请尝试使用文本框的KeyPress事件。

编辑:要禁用文本框中的右键单击,您可以执行以下操作。 将此代码放在文本框的MouseDown事件中。

If e.Button = MouseButtons.Right Then
    MessageBox.Show("can't paste!")
    Exit Sub
End If

但是我注意到您仍然可以使用组合键Ctrl + V粘贴文本。您可以编写此代码以在KeyPress事件中停止该操作。

If Keys.ControlKey And Keys.V Then
       MessageBox.Show("can't paste!")
       Exit Sub
End If

答案 3 :(得分:0)

我建议您尝试使用keydown事件。它发生在textchanged之前甚至之前  按键。