将多个文本框限制为数字

时间:2021-04-30 23:32:49

标签: c# winforms

我找到了以下解决方案来将文本框限制为数字。我的 GUI 中有 20 个文本框,有没有比制作 20 个这样的函数更简洁的方法?

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
 {
        e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar);
 }

2 个答案:

答案 0 :(得分:0)

我的建议是将需要此功能的标准 TextBox 控件替换为自定义控件,该控件还可以在控件中粘贴文本或在设计器中设置控件的 Text 属性时过滤用户输入, 使用 PropertyGrid。

如果只处理 KeyPress 事件,则无法防止错误粘贴。
我认为最好过滤 Text 属性中设置的内容,以避免误解

测试这个简单的自定义文本框控件:它处理直接用户输入和在运行时粘贴的文本。 将 UserPaste 属性设置为 Disallow,将忽略粘贴,而将其设置为 NumbersOnly(默认)仅允许数字:如果在控件中粘贴混合字符,则仅保留数字。

要同时允许输入逗号和点,请更改 [^0-9,.\b] 中的正则表达式。

Designer 中设置的 Text 属性也会被过滤。

要使用此自定义控件替换现有的 TextBox 控件,您可以使用 Visual Studio 中的查找/替换功能(通常使用 CTRL+H 激活):

using System.ComponentModel;
using System.Text.RegularExpressions;
using System.Windows.Forms;

[ToolboxItem(true)]
[DesignerCategory("Code")]
public class TextBoxNumbers : TextBox
{
    private Regex regex = new Regex(@"[^0-9\b]", RegexOptions.Compiled);

    public TextBoxNumbers() { }

    public override string Text {
        get => base.Text;
        set { if (!base.Text.Equals(value)) base.Text = regex.Replace(value, ""); }
    }

    public enum PasteAction {
        NumbersOnly,
        Disallow
    }

    [DefaultValue(PasteAction.NumbersOnly)]
    public PasteAction UserPaste { get; set; }

    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        if (regex.IsMatch(e.KeyChar.ToString())) {
            e.Handled = true;
        }
        base.OnKeyPress(e);
    }

    protected override void WndProc(ref Message m)
    {
        switch (m.Msg) {
            case NativeMethods.WM_PASTE:
                switch (UserPaste) {
                    case PasteAction.Disallow:
                        return;
                    case PasteAction.NumbersOnly:
                        string text = Clipboard.GetText(TextDataFormat.UnicodeText);
                        text = regex.Replace(text, "");
                        NativeMethods.SendMessage(this.Handle, NativeMethods.EM_REPLACESEL, 1, text);
                        return;
                }
                break;
        }
        base.WndProc(ref m);
    }
}

NativeMethods 类:

using System.Runtime.InteropServices;

private class NativeMethods
{
    internal const int WM_PASTE = 0x0302;
    internal const int EM_REPLACESEL = 0xC2;

    [DllImport("User32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    internal static extern int SendMessage(IntPtr hWnd, uint uMsg, int wParam, string lParam);
}

答案 1 :(得分:0)

我的简单和首选解决方案是编写一次方法,然后转到设计器并选择需要它的每个文本框,单击属性中的事件按钮,滚动到 KeyPress 事件和单击一次,现在应该会出现一个下拉箭头,在那里选择您的方法 - 完成。

private void textBox_KeyPress(object sender, KeyPressEventArgs e)
 {
     e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar);
 }
相关问题