微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

限制用户输入并删除 DataGridView 单元格中的特殊字符

如何解决限制用户输入并删除 DataGridView 单元格中的特殊字符

我有一个带有 DataGridTextBoxColumn 的 DataGridView。它绑定到数据源。用户可以输入诸如 -$12,345,678.90 之类的值(在跳出时应用格式)。

所以我想要实现的是当用户键入这样的值时:-$12,678.90,在我的 DataGridTextBoxColumn 中,我需要检查数字的长度,允许最大长度,在我的示例是 10(不包括 - $,.)。

如果输入的数字达到10的长度,我需要阻止用户输入更多数字。

KeyDown 事件处理程序中,我尝试使用正则表达式从用户在单元格中输入的任何内容删除 - $,. 符号,以查找输入的长度并检查它是否超过最大允许长度(例如,10)。像这样:

//length = length value returned after performing Regex replacement with empty
If length = 10 Then
   Handled = True
End if

在设置网格时,我还将 DataGridTextBoxColumn 的最大长度设置为 15(包括 $ - .,)。

这种方法的问题在于,当用户尝试更新一个数字时,例如将 $12,678.90 更改为 $22,678.90,它会将其视为新输入,因此会失败并且不允许用户更新号码。

我还尝试了一些其他事件,例如 CellEndEditCellValueChanged,但这些事件仅在我退出或将焦点从单元格移开时才会触发。

我该如何处理?

解决方法

您可以处理 EditingControlShowing 事件并将编辑控件的文本(它是一个 TextBox)设置为实际值:它应该是 Decimal 类型。
然后,用户可以编辑该值,而不会妨碍任何格式。

CellEndEdit 事件处理程序中,检查 Value 集是否在允许范围内,如果不在,则返回编辑调用 CancelEdit() 并设置 Cell.ErrorText提供出现问题的视觉线索。或者显示一个 MessageBox,或者任何合适的。

为了防止在用户输入无效十进制值时出现异常,如果 CellParsing 未验证输入,则 Decimal.TryParse() 处理程序拒绝并重置先前的值。它还显示包含错误输入的通知。


如果您尚未在其 DefaultCellStyle 中定义 Column 的 ValueTypeFormat,请在设置 [DataGridView].DataSource 后立即执行此操作:
(用列的实际名称替换 ColumnName

DataGridView1.Columns("ColumnName").ValueType = GetType(Decimal)
DataGridView1.Columns("ColumnName").DefaultCellStyle.Format = "C" ' Or "C2"

注意
单元格值回滚假定 DataGridView 数据源支持通知(例如,DataTable 或 BindingList(Of [class]),其中 [class] 实现 INotifyPropertyChange)。


Private Sub DataGridView1_EditingControlShowing(sender As Object,e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
    Dim dgv = DirectCast(sender,DataGridView)
    If TypeOf e.Control Is TextBox AndAlso dgv.CurrentCell.ValueType = GetType(Decimal) Then
        e.Control.Text = CDec(dgv.CurrentCell.Value).ToString()
    End If
End Sub

Private Sub DataGridView1_CellParsing(sender As Object,e As DataGridViewCellParsingEventArgs) Handles DataGridView1.CellParsing
    If e.DesiredType IsNot GetType(Decimal) OrElse String.IsNullOrEmpty(e.Value?.ToString()) Then Return
    Dim dgv = DirectCast(sender,DataGridView)
    Dim cell = dgv(e.ColumnIndex,e.RowIndex)

    If Not Decimal.TryParse(e.Value.ToString(),Nothing) Then
        e.Value = cell.Value
        e.ParsingApplied = True
        cell.ErrorText = $"Invalid Value: {e.Value}"
    Else
        cell.ErrorText = String.Empty
    End If
End Sub

Private Sub DataGridView1_CellEndEdit(sender As Object,e As DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
    Dim dgv = DirectCast(sender,DataGridView)
    If dgv.Columns("ColumnName").Index = e.ColumnIndex Then
        Dim cell = dgv(e.ColumnIndex,e.RowIndex)
        Dim value = CDec(cell.Value)
        If value > 9999999999D OrElse value < -9999999999D Then
            dgv.CancelEdit()
            cell.ErrorText = "Value outside range"
        End If
    End If
End Sub

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?