我认为会有这样的问题,但我没有任何运气搜索。我看到一个问题,有人问同样的事情,但答案是使用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值,但是当您在文本框中键入时它不起作用。
有谁知道我需要做些什么才能让它发挥作用?
答案 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之前甚至之前 按键。