【发布时间】:2020-06-14 20:02:44
【问题描述】:
【问题讨论】:
-
查找输入掩码
-
这是什么应用程序? Web、Windows 窗体、WPF 等等……?
-
@stuartd windows form app使用c#
-
不确定是否可以使用面具。您可以只允许使用Keypress 事件输入数字、逗号、空格和连字符。
【问题讨论】:
所以你需要一个接受的文本框:
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完整代码。
相关
【讨论】:
YourNamespace 更改为您项目的命名空间。
PrintPageRangeTB.cs。 2) 复制class PrintPageRangeTB : TextBox { ... } 块中的代码并将其粘贴到您的新类中。 3) 重建。 4)检查你的工具箱你会找到它。
string.Join Pages 属性如:TextBox1.Text = string.Join(", ", PrintPageRangeTB1.Pages;)
正如 NeutralHadle 所提到的,一种方法是使用输入掩码来限制可能的输入。
另一种方法是在输入文本时运行一些验证逻辑,例如通过将事件处理程序附加到 Validating 事件。如果文本格式不正确,您可以使用ErrorProviderControl 通知用户如何正确格式化输入。更多细节在this answer。
【讨论】: