【问题标题】:How to TextBox inputs of custom format?如何自定义格式的文本框输入?
【发布时间】:2020-06-14 20:02:44
【问题描述】:

如何只允许以这种格式输入文本框?

【问题讨论】:

  • 查找输入掩码
  • 这是什么应用程序? Web、Windows 窗体、WPF 等等……?
  • @stuartd windows form app使用c#
  • 不确定是否可以使用面具。您可以只允许使用Keypress 事件输入数字、逗号、空格和连字符。

标签: c# winforms


【解决方案1】:

所以你需要一个接受的文本框:

  • 一个或多个用逗号和/或...分隔的数字...
  • 数字标记的范围,例如1-5
  • 每个数字/数字应在最小值和最大值范围内。

让我们为此创建一个自定义文本框。

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

namespace YourNamespace
{
    [DesignerCategory("Code")]
    public class PrintPageRangeTB : TextBox
    {
        public PrintPageRangeTB() : base() { }
//...

重写 OnKeyPress 方法以接受 0-9- 以及Control键:

//...
        protected override void OnKeyPress(KeyPressEventArgs e)
        {            
            if (!char.IsControl(e.KeyChar) 
                && !char.IsDigit(e.KeyChar) 
                && e.KeyChar != '-' 
                && e.KeyChar != ',')
                e.Handled = true;
            else
                base.OnKeyPress(e);
        }
//...

重写OnTextChanged 方法以通过调用IsValidInput() 函数来验证输入,并在函数返回false 时删除最后输入的字符:

//...
        protected override void OnTextChanged(EventArgs e)
        {
            if (Text.Trim().Length > 0 && !IsValidInput())
                SendKeys.SendWait("{BS}");
            else
                base.OnTextChanged(e);
        }
//...

IsValidInput() 函数验证 Text 属性并使用 RegEx 检测任何无效格式。还检查最小值和最大值。

//...
        private bool IsValidInput() => IsValidInput(Text);

        private bool IsValidInput(string Input)
        {
            var parts = Input.Split(new[] { '-', ',' },
                StringSplitOptions.RemoveEmptyEntries);
            var pages = parts
                .Where(x => int.TryParse(x, out _)).Select(x => int.Parse(x));

            return Input.Trim().Length > 0
                && pages.Count() > 0
                && !parts.Any(x => x.Length > 1 && x.StartsWith("0")) 
                && !Regex.IsMatch(Input, @"^-|^,|--|,,|,-|-,|\d+-\d+-|-\d+-") 
                && !pages.Any(x => x < Min || x > Max);
        }
//...

添加属性以分配最小值和最大值,返回Text 是否具有有效格式的属性,以及返回所选数字/页数的属性..

//...
        public int Min { get; set; } = 1;
        public int Max { get; set; } = 1000;
        [Browsable(false)]
        public bool IsValidPageRange => IsValidInput();
        [Browsable(false)]
        public IEnumerable<int> Pages
        {
            get
            {
                var pages = new HashSet<int>();

                if (IsValidInput())
                {
                    var pat = @"(\d+)-(\d+)";
                    var parts = Text.Split(new[] { ',' }, 
                        StringSplitOptions.RemoveEmptyEntries);

                    foreach(var part in parts)
                    {
                        var m = Regex.Match(part, pat);

                        if (m != null && m.Groups.Count == 3)
                        {
                            var x = int.Parse(m.Groups[1].Value);
                            var y = int.Parse(m.Groups[2].Value);

                            for (var i = Math.Min(x, y); i <= Math.Max(x, y); i++)
                                pages.Add(i);
                        }
                        else if (int.TryParse(part.Replace("-", ""), out int v))
                            pages.Add(v);
                    }
                }
                return pages.OrderBy(x => x);
            }
        }
//...

连接选择并默认或传递的分隔符分隔它们的函数:

//...
        public string PagesString(string separator = ", ") =>
            string.Join(separator, Pages);
    }
}

重建,从工具箱中删除PrintPageRangeTB,运行并尝试。

Here's完整代码。


相关

  • IP4 文本框。 »

【讨论】:

  • 构建后我尝试导入我的项目。来错按摩箱。 “MYPATH 中没有可以放在工具箱上的组件.....dll。” 怎么办?
  • @TipVisor 什么错误?只需在您的项目中添加一个新类,粘贴代码,重新构建。并确保将命名空间 YourNamespace 更改为您项目的命名空间。
  • 如何将此自定义文本框添加到我的工具箱中
  • @TipVisor 1) 右键单击​​项目文件夹并选择添加 - 类,将其命名为PrintPageRangeTB.cs。 2) 复制class PrintPageRangeTB : TextBox { ... } 块中的代码并将其粘贴到您的新类中。 3) 重建。 4)检查你的工具箱你会找到它。
  • @TipVisor string.Join Pages 属性如:TextBox1.Text = string.Join(", ", PrintPageRangeTB1.Pages;)
【解决方案2】:

正如 NeutralHadle 所提到的,一种方法是使用输入掩码来限制可能的输入。

另一种方法是在输入文本时运行一些验证逻辑,例如通过将事件处理程序附加到 Validating 事件。如果文本格式不正确,您可以使用ErrorProviderControl 通知用户如何正确格式化输入。更多细节在this answer

【讨论】:

    猜你喜欢
    • 2013-11-11
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多