C# TextBox 控件限制输入字符为十六进制字符串

代码功能总结

上述代码用于限制 C# Windows Forms 应用程序中的 TextBox 控件,使其只能输入 16 进制字符(0-9、A-F)和空格,并自动将小写字母转换为大写。主要用途是创建一个用于输入和筛选 16 进制数据的文本框,例如 CAN 总线 ID 过滤、十六进制值搜索等场景。

核心功能

  1. 输入限制:只允许输入数字 0-9、字母 A-F(大小写均可)和空格
  2. 自动转换:自动将输入的小写字母转换为大写
  3. 验证功能:提供方法验证整个文本是否为有效的 16 进制字符串
  4. 清理功能:提供方法获取移除空格后的纯净 16 进制文本

使用方法

  1. 在窗体设计器中添加一个 TextBox 控件(命名为 textBoxFilter
  2. 在窗体类的构造函数中注册事件处理:
cs 复制代码
textBoxFilter.KeyPress += TextBoxFilter_KeyPress;
textBoxFilter.TextChanged += TextBoxFilter_TextChanged;

详细代码

cs 复制代码
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(" ", "");
    }
}

实现说明

  1. KeyPress 事件处理

    • 允许输入的字符包括:
      • 控制字符(如退格、删除键)
      • 数字 0-9
      • 大写字母 A-F
      • 小写字母 a-f(会在 TextChanged 中转换为大写)
      • 空格
    • 无效字符会被阻止输入
  2. TextChanged 事件处理

    • 将输入的小写字母自动转换为大写
    • 使用 TextChanged -= TextBoxFilter_TextChanged 防止递归调用
    • 保持光标的正确位置
  3. 额外功能

    • IsValidHexString 方法验证整个文本是否为有效 16 进制字符串
    • GetCleanHexText 方法获取移除空格后的纯净 16 进制文本

使用示例

在窗体设计器中添加一个名为 textBoxFilter 的 TextBox 控件,然后将上述代码添加到窗体类中。当用户在文本框中输入时,会自动:

  • 阻止输入无效字符
  • 将小写字母转换为大写
  • 允许输入空格作为分隔符

注意事项

  1. 性能考虑

    • 文本转换操作在 UI 线程执行,对于短文本输入影响可忽略
  2. 用户体验

    • 保留空格作为分隔符,方便输入多组 16 进制数
    • 实时反馈无效输入,提升用户体验
  3. 扩展可能性

    • 可修改 KeyPress 事件处理逻辑,允许更多字符(如短横线 - 作为分隔符)
    • 可添加输入长度限制

这个实现方案能够有效限制 TextBox 控件只输入 16 进制字符串和空格,并自动将小写字符转换为大写,满足了数据筛选和输入验证的需求。

相关推荐
wdfk_prog2 小时前
嵌入式面试真题第 13 题:单硬件 Timer 下的高精度多路软件定时器架构设计
c语言·开发语言·面试·职场和发展·嵌入式
oort1232 小时前
吃上了自家的细糠,还挺丝滑,用起来手感还行,OortCloud发布新版AI编程平台,下载 OortCodex,Token多,免费薅
大数据·开发语言·人工智能·ai编程
slandarer2 小时前
MATLAB | 泰勒图绘制,支持各种角度范围
开发语言·数学建模·matlab·nature·顶刊·泰勒图
Xin_ye100862 小时前
第三章:内存泄漏的常见“案发现场”
c#·wpf
mct1232 小时前
c++ iconv 字符utf-8转换gb2312失败
开发语言·c++
Marst Code4 小时前
Python 3.9 已停止维护!从 3.9 到 3.14 全版本深度对比,生产环境该选哪个?
开发语言·python
ZJH__GO4 小时前
网络编程v2--多客户端互通
java·运维·服务器·开发语言·计算机网络
万岳科技系统开发5 小时前
智慧医院小程序开发推动医疗服务流程全面线上化
大数据·开发语言·人工智能
一只小灿灿5 小时前
C++ 修饰符全面详解
开发语言·c++
马里马里奥-5 小时前
从零搭建AI Agent工具链的技术文章大纲
开发语言·qt