【问题标题】:How to prevent special characters in datagridview using vb.net如何使用 vb.net 防止 datagridview 中的特殊字符
【发布时间】:2014-01-16 13:41:37
【问题描述】:

我有一个使用 datagridview 的 windows forms vb.net 程序。我试图找到一种方法来阻止用户在我的 datagridview 中输入特殊字符(例如 $、@、!、#、%、^、&)。当用户输入一个特殊字符时,我会出现一个适当的消息框来解释他们的错误,然后我为他们提供一个默认值。除了防止特殊字符或符号的方法外,我一切正常。我在想这样的事情必须起作用,但我似乎找不到任何方法来阻止这种进入:

 If (columnindex = 0) Then 'checking value for column 1 only
            Dim cellString = DataGridView1.Rows(rowindex).Cells(columnindex).value
            If cellString String.IsSymbol(cellString) = true Then

                    MessageBox.Show("Special Characters Not Allowed")
                End If
                DataGridView1.Rows(rowindex).Cells(columnindex).value = "Default Value"
                Exit Sub
            End If

【问题讨论】:

    标签: vb.net validation datagridview


    【解决方案1】:

    您可以使用EditingControlShowing事件为输入框注册KeyPress函数。

    Private Sub YourDataGridView_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles YourDataGridView.EditingControlShowing
    
        Try
            RemoveHandler e.Control.KeyPress, AddressOf YourFunctionToPreventSpecialCharacters
        Catch ex As Exception
        End Try
    
        If Me.dgvTableViewer.CurrentCell.ColumnIndex = YourDataGridView.Columns("YourColumn").Index Then
            AddHandler e.Control.KeyPress, AddressOf YourFunctionToPreventSpecialCharacters
        End If
    
    End Sub
    

    【讨论】:

    • 这是将处理程序附加到 datagridview 内的 TextBox 控件的最佳方法,但这种实现是有问题的,因为您永远不会删除处理程序。每次您进入控件时,处理程序都会再次添加(因此将触发您添加处理程序的次数 - 在第 10 次进入单元格时,处理程序将触发十次!!)。您需要保留对e.Control 的引用并在该对象上调用RemoveHandler,然后执行AddHandler 并更新您的引用。
    • 是的,我知道,但我删除了这部分代码(我的错误)以简化答案!我只是对 RemoveHandler 使用 Try/Catch 块,而不是保留对 e.Control 的引用。答案已更新。
    • 这也有效。但是,您不需要 try/catch。 RemoveHandler 永远不会抛出异常,除非参数为空。 e.Control 在构造/销毁期间可能为空,因此 If e.Control IsNot Nothing Then... 就足够了。
    【解决方案2】:

    尝试将其放入 DataGridView 的 keydown 事件中:

    Private Sub DataGridView1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles DataGridView1.KeyDown
        Select Case e.KeyCode
            Case Keys.D0 To Keys.D9 And e.Shift
                MsgBox("NOPE.")
                e.SuppressKeyPress = True
        End Select
    End Sub
    

    这基本上检查按键是否来自您计算机上的 0-9 键,以及您是否持有 SHIFT 键。如果是,那么它会显示一个 Msgbox 并抑制按键。这会阻止键盘 0-9 移位 !@#$%^&*() 上的字符。您可以像这样编辑它

    Case Keys.A
        e.Suppress ...
        Msgbox ... etc
    

    【讨论】:

    • 您可以通过 e.Shift 访问 shift 状态 - 您应该使用它,因为消息处理程序可能会在用户释放 shift 键后触发,My.Computer.Keyboard.ShiftKeyDown 将报告 false即使在触发事件时按下了 shift 键
    • 以上所有答案均基于 Key press 事件。如果用户粘贴了值怎么办?
    • 另外,这似乎不起作用 - 输入文本时单元格有焦点,而不是 gridview。
    • 使用 tezzo 的方法绑定此方法将起作用。但是,您必须从处理程序中删除 MsgBox,因为它是一个模态对话框,并且会干扰消息循环序列(使 e.SuppressKeyPress 无法抑制按键)。
    猜你喜欢
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 2019-09-07
    相关资源
    最近更新 更多