C# 仅文本框中的数字

C# 仅文本框中的数字,c#,C#,上述代码工作不正常 下面是图像错误: 问题空间是“剪贴板”如果这是针对WinForms的,我的建议是使用。这是一个专门构建的控件,只允许某些类型的用户输入 您可以通过设计器或在代码中设置掩码。 例如,对于5位数字: if (!(char.IsDigit(e.KeyChar))) { e.Handled = true; } 处理TextChanged事件或使用MaskedTextBox maskedTextBox1.Mask = "00000";

上述代码工作不正常

下面是图像错误:


问题空间是“剪贴板”

如果这是针对WinForms的,我的建议是使用。这是一个专门构建的控件,只允许某些类型的用户输入

您可以通过设计器或在代码中设置掩码。 例如,对于5位数字:

      if (!(char.IsDigit(e.KeyChar)))
     {
        e.Handled = true;
     }

处理TextChanged事件或使用MaskedTextBox

maskedTextBox1.Mask = "00000";
maskedTextBox1.ValidatingType = typeof(int);

我曾经就StackOverflow回答过类似的问题。
以下是问题的链接:

本质上,您必须将my类放入代码中,并将其应用于所有要限制输入数据的文本框


我编写的TextBoxFilter类允许您将输入限制为字母数字字母数字货币用户指定的输入。

是的,这是键盘过滤的典型敌人。TextBox控件没有任何内置事件来截取剪贴板中的粘贴。您必须自己检测Ctrl+V键,并在剪贴板上显示屏幕。GetText()

逻辑很难正确。这是一个可以让这一切变得简单一点的课程。向项目中添加一个新类并粘贴如下所示的代码。编译。将新控件从工具箱顶部拖放到窗体上。双击它并编写ValidateChar事件处理程序。与此类似,仅允许输入数字:

            if (textBox1.Text.Count(a => !char.IsDigit(a)) > 0)
        {
            textBox1.Text = new string(textBox1.Text.Where(a => char.IsDigit(a)).ToArray());
        }
守则:

    private void validatingTextBox1_ValidateChar(object sender, ValidateCharArgs e) {
        if (!"0123456789".Contains(e.KeyChar)) e.Cancel = true;
    }
使用系统;
使用系统组件模型;
使用System.Windows.Forms;
使用系统文本;
[DefaultEvent(“ValidateChar”)]
类ValidatingTextBox:TextBox{
公共事件处理程序ValidateChar;
ValidateChar上受保护的虚拟无效(ValidateCharArgs e){
var handler=ValidateChar;
if(handler!=null)handler(this,e);
}
按键时受保护的覆盖无效(按键事件参数e){
如果(e.KeyChar>=''){//允许控制键正常工作
var args=新的validateChargs(例如KeyChar);
OnValidateChar(args);
如果(参数取消){
e、 已处理=正确;
返回;
}
}
按键(e);
}
私有无效HandlePaste(){
如果(!Clipboard.ContainsText())返回;
string text=Clipboard.GetText();
var toPaste=新的StringBuilder(text.Length);
foreach(text.ToCharArray()中的字符ch){
var args=新的ValidateCharArgs(ch);
OnValidateChar(args);
如果(!args.Cancel)toPaste.Append(ch);
}
如果(toPaste.Length!=0){
Clipboard.SetText(toPaste.ToString());
这个。粘贴();
}
}
涂胶;
受保护的覆盖无效WndProc(参考消息m){
如果(m.Msg==0x302&&!粘贴){
粘贴=真;
把手扣件();
粘贴=假;
}
else base.WndProc(参考m);
}
}
类ValidateCharArgs:EventArgs{
public ValidateCharArgs(char ch){Cancel=false;KeyChar=ch;}
公共bool Cancel{get;set;}
公共字符KeyChar{get;set;}
}

您是否测试过事件是否在粘贴时触发?我很确定它不是。Ok可能是重复的,但是如果你处理textchanged事件,不管是否处理剪贴板,你总是知道文本框中的文本类型。这是如果你只需要在字段中粘贴数字的代码
using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Text;

[DefaultEvent("ValidateChar")]
class ValidatingTextBox : TextBox {
    public event EventHandler<ValidateCharArgs> ValidateChar;

    protected virtual void OnValidateChar(ValidateCharArgs e) {
        var handler = ValidateChar;
        if (handler != null) handler(this, e);
    }

    protected override void OnKeyPress(KeyPressEventArgs e) {
        if (e.KeyChar >= ' ') {   // Allow the control keys to work as normal
            var args = new ValidateCharArgs(e.KeyChar);
            OnValidateChar(args);
            if (args.Cancel) {
                e.Handled = true;
                return;
            }
        }
        base.OnKeyPress(e);
    }
    private void HandlePaste() {
        if (!Clipboard.ContainsText()) return;
        string text = Clipboard.GetText();
        var toPaste = new StringBuilder(text.Length);
        foreach (char ch in text.ToCharArray()) {
            var args = new ValidateCharArgs(ch);
            OnValidateChar(args);
            if (!args.Cancel) toPaste.Append(ch);
        }
        if (toPaste.Length != 0) {
            Clipboard.SetText(toPaste.ToString());
            this.Paste();
        }
    }

    bool pasting;
    protected override void WndProc(ref Message m) {
        if (m.Msg == 0x302 && !pasting) {
            pasting = true;
            HandlePaste();
            pasting = false;
        }
        else base.WndProc(ref m);
    }
}

class ValidateCharArgs : EventArgs {
    public ValidateCharArgs(char ch) { Cancel = false; KeyChar = ch; }
    public bool Cancel { get; set; }
    public char KeyChar { get; set; }
}
control.TextChanged += (s, a) => {
    string value = string.Empty;
    foreach (char ch in control.Text.ToCharArray())
    {
        if (char.IsDigit(ch))
        {
            value += ch.ToString();
        }
    }
    control.Text = value;
};