65.9K
CodeProject 正在变化。 阅读更多。
Home

HandlEdInput - 强大且高度可定制的 TextBox、RichTextBox 和 ComboBox 输入处理器

starIconstarIconstarIconstarIconstarIcon

5.00/5 (29投票s)

2017年1月22日

CPOL

8分钟阅读

viewsIcon

58133

downloadIcon

2372

处理和验证 TextBox、RichTextBox 和 ComboBox 中的输入键入和按键,显示自定义气球提示消息

Preview

引言

HandlEdInput 处理和验证 TextBoxRichTextBoxComboBox 的输入键入和按键,显示自定义气球提示消息。

其提供的优势非常大,得益于其简单易用的特性,以及高度可定制的属性,不仅可以阻止输入键入和按键,还可以使用正则表达式进行验证,同时在 ComboBox 中还可以验证键入的输入是否在项目列表中,以及更多其他功能。

这是它能做什么的列表。

处理(控制输入)

  • 阻止字母输入
  • 阻止数字输入
  • 阻止非字母数字字符输入
  • 阻止以上一项、几项或全部
  • 只允许特定字符,阻止其他字符输入
  • 只阻止特定字符,允许其他字符输入
  • 阻止特定按键生效,例如,阻止空格键或退格键
  • 阻止控件中的任何键盘快捷键,以及上下文菜单
  • 每次只允许一个空格
  • 在输入最开头禁止空格
  • 通过正则表达式模式验证输入
  • 验证 ComboBox 输入是否在项目列表中
  • 新增! 处理粘贴命令
  • 新增! 禁用文本选择
  • 新增! 处理文本拖放

消息(在每次检测到的操作时显示自定义气球提示)

  • 设置消息标题
  • 设置消息内容
  • 在信息、错误、警告或无图标之间选择
  • 在内容消息中使用参数,这些参数会即时替换,例如,“您按下了 {KeyData}
  • 更改消息预设的默认语言
  • 更改气球提示的超时时间
  • 设置任何显示的气球提示案例的可见性
  • 隐藏所有气球提示
  • 以及更多...

最棒的是,所有这些设置都可以非常轻松地组合使用。

例如,假设您想捕获一个电话号码。

  1. 您可以轻松地开始阻止除数字以外的所有内容。
  2. 然后您可以包含字符:+ ( ) -
  3. 为了验证输入,您可以包含一个正则表达式模式。
  4. 您可以设置每次只允许一个空格。
  5. 最后,您可以自定义在正则表达式模式不匹配或匹配时显示的气球提示。

背景

我开始这个项目是为了个人使用,我需要一个健壮的输入处理程序来处理我正在进行的一个项目,而不是只编写输入阻止的代码。所以我认为拥有一个通用、灵活且完整的解决方案来限制和控制输入将很有用,这就是这个项目的诞生。起初,它是一个非常简单的代码,满足了我当时的需求。但几天后,我决定继续在这方面工作,考虑新的有用的想法可以纳入,经过几周的工作……现在它已经准备好分享了。

预览

Preview

Preview

Preview

Using the Code

首先,您必须在类实例声明中传入 TextBoxRichTextBoxComboBox 控件。

Handled.Input T1 = new Handled.Input(textBox1);

提示:您也可以传入多个控件,用逗号分隔,如果您希望多个控件具有相同的行为)。

然后您可以使用类的实例对象开始设置。

Handled.Input T1 = new Handled.Input(textBox1);
T1.Handler.Settings.Set_BlockadeMode = true;
T1.Handler.Handle_Numeric = true;
T1.Handle();

给出的示例是如何只允许数字作为输入的简单演示。

让我们来了解一些更高级的控件处理

Handled.Input T2 = new Handled.Input(textBox2);
T2.Handler.Handle_NonAlphanumeric = true;
T2.Handler.List_IncludeChars = new List<char> { '_', '-', '.' };
T2.Handler.List_RestrictKeys = new List<string> { "Space" };
T2.Message.OnFocus.Set_Title = "Please enter a username";
T2.Message.OnFocus.Set_Message = 
"Username can only contain {tokens} including the following characters:\n{include_chars}";
T2.Message.OnInvalidInput.Set_Icon = Handled.BalloonTip.ICON.ERROR;
T2.Message.OnInvalidInput.Set_Title = "Invalid";
T2.Message.OnInvalidInput.Set_Message = "Enter a valid input.";
T2.Message.OnIncludeChars.Set_Visible = false;
T2.Message.Settings.Set_AllTimeouts = 5000;
T2.Handle();

一旦声明了类实例,传入要处理的控件

  1. 阻止任何非字母数字字符
  2. 只包含以下字符:_ -
  3. 限制任何可能的空白输入
  4. 为气球提示焦点消息设置消息标题和内容
  5. 为气球提示无效消息设置自定义图标、消息标题和内容
  6. 将包含字符消息的可见性设置为隐藏
  7. 将气球提示的超时时间延长到 5 秒
  8. 最后确认处理控件

(注意:设置的顺序无关紧要,只要以类实例声明开始,以 Handle() 方法结束)。

一个更高级的例子将包括正则表达式验证

Handled.Input T3 = new Handled.Input(textBox3);
T3.Handler.Settings.Set_BlockadeMode = true;
T3.Handler.Handle_Alpha = true;
T3.Handler.List_RestrictKeys = new List<string> { "Space" };
T3.Handler.Settings.Set_RegexMatchPattern = "^(?=[MDCLXVI])M*D?C{0,4}L?X{0,4}V?I{0,4}$";
T3.Handler.Settings.Set_RegexOptions = 
System.Text.RegularExpressions.RegexOptions.IgnoreCase;
T3.Handler.Settings.Set_ShortcutsEnabled = false;
T3.Message.OnFocus.Set_Message = "Enter a roman number.";
T3.Message.OnRegexMismatch.Set_Message = "Type a valid roman number.";
T3.Message.OnRegexMatch.Set_Message = "The roman number is valid.";
T3.Message.OnRestrictKeys.Set_Visible = false;
T3.Handle();

一旦声明了类实例,传入要处理的控件

  1. 启用阻塞模式,这意味着它将反转处理并开始禁用所有字符类型(字母、数字和非字母数字)
  2. 只允许字母字符
  3. 限制任何可能的空白输入
  4. 设置正则表达式模式以仅匹配有效的罗马数字
  5. 指示正则表达式的行为不区分大小写(也可以在正则表达式模式中设置此项,但此处目的是展示正则表达式选项属性)
  6. 禁用控件内的任何快捷键组合(Ctrl+ACtrl+CCtrl+V..)并禁用其上下文菜单
  7. 为气球提示焦点消息设置内容
  8. 为气球提示正则表达式不匹配消息设置内容
  9. 为气球提示正则表达式匹配消息设置内容
  10. 当检测到非字母字符时,隐藏限制键气球提示消息的可见性
  11. 最后确认处理控件

现在让我们看一个简单的 ComboBox 验证示例

Handled.Input C1 = new Handled.Input(comboBox1);
C1.Handler.Settings.Set_BlockadeMode = true;
C1.Handler.Handle_Numeric = true;
C1.Handler.Settings.Set_ComboBoxValidator = true;  
C1.Message.OnFocus.Set_Title = "Set Day";
C1.Message.OnFocus.Set_Message = "Please set the day here.";
C1.Message.OnInvalidInput.Set_Message = "Set a valid day.";
C1.Message.OnComboBoxInvalidInput.Set_Message = "Set a valid day of the month.";
C1.Message.OnComboBoxValidInput.Set_Message = "The day is valid now.";
C1.Handle();

一旦声明了类实例,传入要处理的控件

  1. 启用阻塞模式,禁用所有字符输入
  2. 只允许数字输入
  3. 启用 ComboBox 验证器,这意味着它将在项目列表中查找输入的字符并进行验证
  4. 为气球提示焦点消息设置标题
  5. 为气球提示焦点消息设置内容
  6. 为气球提示无效输入消息设置内容(例如,尝试输入字母字符)
  7. ComboBox 气球提示无效输入消息设置内容(例如,输入了有效的数字字符但不在 ComboBox 项目列表中)
  8. ComboBox 气球提示有效输入消息设置内容
  9. 最后确认处理控件

消息参数

您可以使用一组参数来设置气球提示消息。
这些参数将在实时替换为一些有用的信息,例如,为了让用户第一次知道输入控件可以包含什么,您会在焦点消息中使用类似这样的内容:“输入只能包含 {tokens},包括以下字符:\n{include_chars}。”
可用的参数如下

  • {tokens} = 显示允许的令牌
  • {KeyChar} = 显示按下的字符
  • {KeyData} = 显示按键的名称
  • {exclude_chars} = 显示排除字符列表
  • {include_chars} = 显示包含字符列表
  • {restrict_keys} = 显示受限按键列表

建议

添加了可选的自定义控件。这些自定义控件现在可以通过支持文本 拖放粘贴 来完全处理所有输入尝试(通过键盘快捷键和上下文菜单两种方式)。
为了实现完整的输入处理,建议使用这些自定义控件。
您可以在“设计器工具箱”中找到它们。将它们添加到您的 UI 后,您就可以自定义它们的行为以满足您的需求了。

致谢

非常感谢 Chris 和 Ivan Petrov 提供代码,使我能够使这个项目得以发展,更多细节请查看代码。

历史

  • 07/17/2019
    • HandledTextBoxHandledRichTextBoxHandledComboBox 控件中引入了文本 拖放 验证支持! (需要启用“Set_DropValidationOnCustomControls”,这将自动设置“AllowDrop”/“EnableAutoDragDrop”属性)
    • HandledRichTextBox 中添加了 RTF 格式支持,用于文本 粘贴/拖放,并且不需要重新格式化空格/换行符。
    • 重命名了属性。(“Is_RegexValidMatch”/“Is_ComboBoxInputOnList”)
  • 07/01/2019
    • 修复了小 bug(曾经有一种特定方式允许在单空格处理中粘贴一个空格到另一个空格旁边)
    • 对某些属性进行了小型的驼峰命名更改
  • 2019/06/29 - HandlEdInput 变得更强大!
    • 添加了支持 粘贴 命令处理的自定义控件!
    • 性能改进!
    • 现在可以更轻松地更改默认气球提示消息的语言,并在 Handled.Input 类中添加您自己的自定义语言。
    • 现在,在限制按键列表中不再需要传递“Control”/“Shift”变体(例如,“Space, Control”、“Space, Shift”)来避免任何可能的绕过受限按键的方法。只需传递常规情况(例如,“Space”)。
    • 除了在限制按键列表中限制“Space”外,您现在还可以将空格字符添加到排除列表中以避免空格。
    • 为所有类型的气球提示消息添加了单独的超时属性(可以全局设置所有消息设置的超时时间)。
    • 在焦点气球提示中,消息仅在输入为空时可见(仍然可以通过按“F1”随时手动显示)。
    • 添加了“Set_ContextMenuOnCustomControls”来定义是否在 HandledTextBoxHandledRichTextBoxHandledComboBox 上设置上下文菜单。(默认值:True
    • 添加了“Set_ContextMenuShortcutsOnCustomControls”来定义是否在 HandledTextBoxHandledRichTextBox HandledComboBox 上下文菜单中显示命令快捷方式。(默认值:True
    • 添加了“Handle_TextSelectionOnCustomTextBox”来定义 HandledTextBox 上的文本是否可以被选择(自动将文本选择键盘快捷键添加到限制按键列表)。
    • 添加了“Handle_TextSelectionOnCustomRichTextBox”来定义 HandledRichTextBox 上的文本是否可以被选择(自动将文本选择键盘快捷键添加到限制按键列表)。
    • 添加了“IsRegexValidMatch”以编程方式查询正则表达式模式是否匹配!
    • 添加了“IsComboBoxInputOnList”以编程方式查询当前输入是否在 ComboBox 列表上!
    • 禁用无效输入时的按钮事件现在仅适用于相应的气球提示无效消息可见时。
    • Handle_BeginSpace”和“Handle_OneSingleSpacing”在字符被删除时现在更强大、更智能了!
    • 修复了在失去控件焦点时未隐藏气球提示(气球提示即使在最小化窗口后仍保持可见)。
  • 2017/01/22 - 首次发布
© . All rights reserved.