我在为 TextBox 构建输入过滤器时遇到了一些困难(WFP,但这在这里应该无关紧要)
我需要抑制所有输入,但是:
-数字(整数 - 无浮点数,组)-基本
数学符号:(,), +,-,*,/
是的,目标是有一种公式评估。这部分适用于 Sriptcontrol-Method(来自:http ://www.vb-tips.com/Eval.aspx )我还发现了几个通过正则表达式过滤的线索(对不起,不记得来源......) :
Regex("[\d\(\)\+\-\*\/]")
现在的问题是,例如字符 '+' 永远不会出现在 e.Key 参数中
按下 NumPad-'+' 给我
e.Key=85
e.Key.Tostring=Add
Trying from Keyboard '+'
e.Key =141
e.Key.ToString=OemPlus
所以正则表达式永远不会找到与这些允许的字符匹配的内容。
由于 Windows 识别我击中的键并将我看到的字符放在键盘上,我猜,必须有一种方法可以“准确”捕获用户想要击中的键 :-)
我还需要抑制任何修饰符-字符(例如 AltGr+2:我的德语布局上的正方形)
我的代码粘贴在这里(由于试验可能有点混乱)
Private Sub tb_PreviewKeyDown(sender As System.Object, e As System.Windows.Input.KeyEventArgs) Handles TB0.PreviewKeyDown
Dim s As TextBox = sender
Debug.WriteLine(e.Key.ToString & " -" & e.Key)
Dim rx As New Regex("[\d\(\)\+\-\*\/]|Add|Subtract|Divide|Multiply|Return|Tab|Back")
If Not rx.IsMatch(e.Key.ToString) Then
e.Handled = True
Return
End If
If e.Key = Key.Enter Or e.Key = Key.Tab Then
If s.Text.Trim = "" Then Return
If Not IsNumeric(s.Text) Then
Try
Dim ev As New MSScriptControl.ScriptControl
ev.Language = "VBScript"
ev.AllowUI = False
ev.Reset()
s.Text = CStr(Math.Round(CDbl(ev.Eval(s.Text))))
s.SelectAll()
Catch ex As Exception
s.SelectAll()
e.Handled = True
Return
End Try
End If
s.SelectAll()
End If
End Sub
对此的任何提示都将受到高度赞赏。
在此先感谢,
丹尼尔