C# 如何防止将字符串(a-z)粘贴到C中的文本框(仅数字)中#

C# 如何防止将字符串(a-z)粘贴到C中的文本框(仅数字)中#,c#,.net,C#,.net,最近我注意到,在我的一个项目中,一些智能用户在文本框中传递字符串(字母),在按键事件期间只允许数字值(0-9)。不幸的是,NVARCHAR中的数据库列类型不正确,这就是数据插入操作以无效数据完成的原因。我的项目(Winform)足够大,可以更改该列的数据类型(NVARCHAR到INT)。在SQL Server中计算该列的总和时出错。 这是我的按键事件,仅用于数字验证 private void txtInputValue_KeyPress(object sender, KeyPressEventA

最近我注意到,在我的一个项目中,一些智能用户在文本框中传递字符串(字母),在按键事件期间只允许数字值(0-9)。不幸的是,NVARCHAR中的数据库列类型不正确,这就是数据插入操作以无效数据完成的原因。我的项目(Winform)足够大,可以更改该列的数据类型(NVARCHAR到INT)。在SQL Server中计算该列的总和时出错。 这是我的按键事件,仅用于数字验证

private void txtInputValue_KeyPress(object sender, KeyPressEventArgs e)
{
    if (!char.IsDigit(e.KeyChar)) e.Handled = true;         //Just Digits
    if (e.KeyChar == (char)8) e.Handled = false;            //Allow Backspace
}
现在,我如何防止用户停止粘贴除数字(0-9)之外的一些无效数据。
提前感谢您的帮助。

假设您的项目是WinForms-您走错了方向

看起来你所需要的就是

在该控件中,您可以为“仅数字”掩码设置
Mask
属性,该掩码不仅可以防止从键盘输入“非数字”字符,还可以防止粘贴


有关掩码格式的参考信息,请参见。

使用
按键
添加
文本更改
事件

    private void txtInputValue_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (!char.IsDigit(e.KeyChar)) e.Handled = true;         //Just Digits
        if (e.KeyChar == (char)8) e.Handled = false;            //Allow Backspace
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        if (System.Text.RegularExpressions.Regex.IsMatch(textBox1.Text, "[^0-9]"))
        {
            MessageBox.Show("Please enter only numbers.");
            textBox1.Text = string.Empty;
        }
    }

希望这有帮助…

您可以简单地将文本框的
ShortcutsEnabled
设置为false。(根据建议)


?您的项目是WinForms、WPF还是其他?很可能是WinForms,因为事件处理程序提供了一个
KeyPressEventArgs
。我建议不要检查每个keypress事件的输入,而是等待textchanged事件,然后检查它是否为您的有效输入(即数字或您拥有的内容),另一种方法(虽然不如
MaskedTextBox
,但仍然是用户友好的)是让用户键入任何内容(虽然应该清楚预期输入的内容),但在更改时验证值(在
TextChanged
事件处理程序中)。验证结果可以显示给用户,这样用户就可以在不限制输入的情况下纠正错误。很好的例子是输入
double
值。如果
double.TryParse
失败,那么您可以显示红色边框或一些图标来通知用户输入错误。这种方法非常适合处理特殊情况(空白值、常量:
NaN
+无穷大
等)。这个建议是一个可用性恐惧:当输入了一个错误的字符时,不要使用MessageBox,当然也不要清除整个文本框。@CodeCaster错误的字符将被KeyPress事件阻止,这将只在粘贴的文本中弹出…现在它不允许使用箭头键,当用户设法在文本框中获取一个非数字字符时,仍然会清除整个文本框。不要拙劣地改造车轮。使用蒙面文本框或测试代码。@CodeCaster我接受蒙面文本框是解决方案,但按键和TextChanged事件的组合对我有效,我已经用我的知识对其进行了测试。只有当鼠标指针粘贴了字母表时,才会清除文本。@CodeCaster有时会提供更好的选项。。。
txtInputValue.ShortcutsEnabled = false;