C# TextBox 控件限制输入字符为十六进制字符串
代码功能总结
上述代码用于限制 C# Windows Forms 应用程序中的 TextBox
控件,使其只能输入 16 进制字符(0-9、A-F)和空格,并自动将小写字母转换为大写。主要用途是创建一个用于输入和筛选 16 进制数据的文本框,例如 CAN 总线 ID 过滤、十六进制值搜索等场景。
核心功能
- 输入限制:只允许输入数字 0-9、字母 A-F(大小写均可)和空格
- 自动转换:自动将输入的小写字母转换为大写
- 验证功能:提供方法验证整个文本是否为有效的 16 进制字符串
- 清理功能:提供方法获取移除空格后的纯净 16 进制文本
使用方法
- 在窗体设计器中添加一个
TextBox
控件(命名为textBoxFilter
) - 在窗体类的构造函数中注册事件处理:
textBoxFilter.KeyPress += TextBoxFilter_KeyPress;
textBoxFilter.TextChanged += TextBoxFilter_TextChanged;
详细代码
using System;
using System.Windows.Forms;public partial class YourForm : Form
{public YourForm(){InitializeComponent();// 注册事件处理textBoxFilter.KeyPress += TextBoxFilter_KeyPress;textBoxFilter.TextChanged += TextBoxFilter_TextChanged;}private void TextBoxFilter_KeyPress(object sender, KeyPressEventArgs e){// 允许的字符:0-9, A-F, a-f, 空格if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && !((e.KeyChar >= 'A' && e.KeyChar <= 'F') || (e.KeyChar >= 'a' && e.KeyChar <= 'f')) && e.KeyChar != ' '){e.Handled = true; // 阻止输入无效字符}}private void TextBoxFilter_TextChanged(object sender, EventArgs e){// 将小写字符转换为大写if (textBoxFilter.Text != null){string upperCaseText = textBoxFilter.Text.ToUpper();if (upperCaseText != textBoxFilter.Text){// 防止递归调用textBoxFilter.TextChanged -= TextBoxFilter_TextChanged;textBoxFilter.Text = upperCaseText;textBoxFilter.SelectionStart = textBoxFilter.Text.Length;textBoxFilter.TextChanged += TextBoxFilter_TextChanged;}}}// 额外:验证整个文本是否为有效的16进制字符串private bool IsValidHexString(string text){// 移除所有空格string cleanText = text.Replace(" ", "");// 验证是否为空或仅包含16进制字符if (string.IsNullOrEmpty(cleanText))return true;foreach (char c in cleanText){if (!char.IsDigit(c) && !(c >= 'A' && c <= 'F'))return false;}return true;}// 额外:获取清理后的16进制文本(移除空格)public string GetCleanHexText(){return textBoxFilter.Text?.Replace(" ", "");}
}
实现说明
-
KeyPress 事件处理:
- 允许输入的字符包括:
- 控制字符(如退格、删除键)
- 数字 0-9
- 大写字母 A-F
- 小写字母 a-f(会在 TextChanged 中转换为大写)
- 空格
- 无效字符会被阻止输入
- 允许输入的字符包括:
-
TextChanged 事件处理:
- 将输入的小写字母自动转换为大写
- 使用
TextChanged -= TextBoxFilter_TextChanged
防止递归调用 - 保持光标的正确位置
-
额外功能:
IsValidHexString
方法验证整个文本是否为有效 16 进制字符串GetCleanHexText
方法获取移除空格后的纯净 16 进制文本
使用示例
在窗体设计器中添加一个名为 textBoxFilter
的 TextBox 控件,然后将上述代码添加到窗体类中。当用户在文本框中输入时,会自动:
- 阻止输入无效字符
- 将小写字母转换为大写
- 允许输入空格作为分隔符
注意事项
-
性能考虑:
- 文本转换操作在 UI 线程执行,对于短文本输入影响可忽略
-
用户体验:
- 保留空格作为分隔符,方便输入多组 16 进制数
- 实时反馈无效输入,提升用户体验
-
扩展可能性:
- 可修改
KeyPress
事件处理逻辑,允许更多字符(如短横线-
作为分隔符) - 可添加输入长度限制
- 可修改
这个实现方案能够有效限制 TextBox 控件只输入 16 进制字符串和空格,并自动将小写字符转换为大写,满足了数据筛选和输入验证的需求。