0

我在为 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


对此的任何提示都将受到高度赞赏。
在此先感谢,
丹尼尔

4

1 回答 1

0

Hans Passant 的评论解决了我的问题!

于 2013-10-11T08:46:54.967 回答