最近一直在做一个支持串口,TCP,UDP通讯调试的一体化工具(也就是C#串口调试工具 v2.0的第三版),其中涉及到16进制数据和ASCII码的输入,所以继承了TextBox的基础上,写了这个支持Hex与ASCII输入和切换的文本框。

主要实现了如下功能:

  • 可输入Hex,ASCII
  • 支持复制,粘贴,剪切操作。在粘贴数据时,可自动对输入的数据格式检查。
  • 可切换显示Hex与ASCII的输入文本框
  • Hex输入时可自动每2个字符之间添加空格

本人经过了一些简单测试,目前未发现BUG。如果有什么写的不好,或者不对的地方,欢迎留言指正。

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.ComponentModel; namespace LeafSoft.Units
{
/// <summary>
/// Hex/ASCII输入文本框
/// 作者:一叶知秋
/// 日期:2013年7月11日
/// 可输入Hex,ASCII
/// 可切换显示Hex与ASCII的输入文本框
/// Hex输入时可自动每2个字符之间添加空格
/// </summary>
public class BytesBox:TextBox
{
ContextMenuStrip CMenu = new ContextMenuStrip();
ToolStripMenuItem CM_Type = new ToolStripMenuItem();
ToolStripMenuItem CM_Clear = new ToolStripMenuItem(); public BytesBox()
{
#region 快捷菜单
CM_Type.Name = "CM_Type";
CM_Type.Size = new System.Drawing.Size(127, 22);
CM_Type.Text = "ASCII";
CM_Type.Click += new System.EventHandler(CM_Type_Click);
CM_Clear.Name = "CM_Clear";
CM_Clear.Size = new System.Drawing.Size(127, 22);
CM_Clear.Text = "清空";
CM_Clear.Click += new System.EventHandler(CM_Clear_Click);
CMenu.Name = "CMenu";
CMenu.ShowImageMargin = false;
CMenu.Size = new System.Drawing.Size(128, 48);
CMenu.Items.AddRange(new ToolStripItem[] {
CM_Type,CM_Clear}); this.ContextMenuStrip = CMenu;
#endregion
} #region 属性
bool _IsHex = true;
[Description("True:Hex;False:ASCII"), Category("输入格式设置")]
public bool IsHex
{
set {
_IsHex = value;
if (_IsHex)
{
CM_Type.Text = "ASCII";
}
else
{
CM_Type.Text = "Hex";
}
}
get {
return _IsHex;
}
}
#endregion #region 菜单操作
/// <summary>
/// HEX/ASCII 格式切换
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void CM_Type_Click(object sender, EventArgs e)
{
if (IsHex)
{//切换到ASCII格式
IsHex = false;
if (this.Text.Length > 0)
{
string[] HexStr = this.Text.Trim().Split(' ');
byte[] data = new byte[HexStr.Length];
for (int i = 0; i < HexStr.Length; i++)
{
data[i] = (byte)(Convert.ToInt32(HexStr[i], 16));
}
this.Text = new ASCIIEncoding().GetString(data);
}
}
else
{//切换到Hex格式
IsHex = true; if (this.Text.Length > 0)
{
byte[] data = new ASCIIEncoding().GetBytes(this.Text.Trim());
StringBuilder sb = new StringBuilder();
for (int i = 0; i < data.Length; i++)
{
sb.AppendFormat("{0:x2}", data[i]);
}
this.Text = sb.ToString();
}
} }
/// <summary>
/// 清空数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void CM_Clear_Click(object sender, EventArgs e)
{
this.Text = "";
}
#endregion #region 输入控制
protected override void OnTextChanged(EventArgs e)
{
if (_IsHex)
{//Hex输入
string Content = this.Text.Replace(" ", "");//获取去除空格后的字符内容
int SpaceCount = Content.Length / 2;
int StartIndex = 2;
for (int i = 0; i < SpaceCount; i++)
{
Content = Content.Insert(StartIndex, " ");
StartIndex = StartIndex + 3;
}
this.Text = Content.TrimEnd().ToUpper();
}
this.SelectionStart = this.Text.Length;
} protected override void OnKeyPress(KeyPressEventArgs e)
{
if (_IsHex)
{
if ((e.KeyChar >= '0' && e.KeyChar <= '9')//数字0-9键
|| (e.KeyChar >= 'A' && e.KeyChar <= 'F')//字母A-F
|| (e.KeyChar >= 'a' && e.KeyChar <= 'f')//字母a-f
|| e.KeyChar == 0x08//退格键
|| e.KeyChar == 0x03//拷贝
|| e.KeyChar == 0x18)//剪切
{
e.Handled = false;
return;
}
}
else
{
if ((e.KeyChar >= 0x20 && e.KeyChar <= 0x7E)
|| e.KeyChar == 0x08//退格键
|| e.KeyChar == 0x0D//回车键
|| e.KeyChar == 0x03//拷贝
|| e.KeyChar == 0x18)//剪切
{
e.Handled = false;
return;
}
}
if (e.KeyChar == 0x16)//粘贴
{//粘贴前数据格式检查
if (CheckPaste())
{
e.Handled = false;
return;
}
}
e.Handled = true;
} /// <summary>
/// 粘贴数据格式检查
/// </summary>
/// <returns></returns>
private bool CheckPaste()
{
try
{
char[] PasteChar = Clipboard.GetDataObject().GetData(DataFormats.Text).ToString().ToCharArray();
if (_IsHex)
{
foreach (char data in PasteChar)
{
if (!((data >= '0' && data <= '9')//数字0-9键
|| (data >= 'A' && data <= 'F')//字母A-F
|| (data >= 'a' && data <= 'f')//字母a-f
|| data == 0x20))//空格
{
MessageBox.Show("粘贴数据含有非法字符,只能包含数字0-9,大写英文字母A-F,小写英文字母a-f以及空格!", "非法的粘贴", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
}
}
else
{
foreach (char data in PasteChar)
{
if (!((data >= 0x20 && data <= 0x7E)
|| data == 0x0A
|| data == 0x0D))//回车键
{
MessageBox.Show("粘贴数据含有非法字符,只能包含ASCII码字符!", "非法的粘贴", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
}
}
return true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return false;
}
}
#endregion #region 公共方法
/// <summary>
/// 获取命令对象
/// </summary>
/// <returns></returns>
public Model.Command GetCMD()
{
try
{
if (this.Text.Trim() == string.Empty)
{
MessageBox.Show("不允许内容为空!");
return null;
}
Model.Command Cmd = new Model.Command();
Cmd.IsHex = _IsHex;
if (Cmd.IsHex)
{//Hex
string[] HexStr = this.Text.Trim().Split(' ');
Cmd.DataBytes = new byte[HexStr.Length];
for (int i = 0; i < HexStr.Length; i++)
{
Cmd.DataBytes[i] = (byte)(Convert.ToInt32(HexStr[i], 16));
}
}
else
{ //ASCII
Cmd.DataBytes = new ASCIIEncoding().GetBytes(this.Text.Trim());
}
return Cmd;
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
return null;
}
}
/// <summary>
/// 设置命令对象
/// </summary>
/// <param name="Cmd"></param>
public void SetCMD(Model.Command Cmd)
{
try
{
this._IsHex = Cmd.IsHex;
if (this._IsHex)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < Cmd.DataBytes.Length; i++)
{
sb.AppendFormat("{0:x2}", Cmd.DataBytes[i]);
}
this.Text = sb.ToString();
}
else
{
this.Text = new ASCIIEncoding().GetString(Cmd.DataBytes);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
#endregion
}
}
using System;
using System.Collections.Generic;
using System.Text; namespace Model
{
/// <summary>
/// 命令对象
/// </summary>
public class Command
{
bool _IsHex = true;
byte[] _DataBytes = null; /// <summary>
/// 是否16进制数据
/// </summary>
public bool IsHex
{
set {
_IsHex = value;
}
get {
return _IsHex;
}
} /// <summary>
/// byte数据
/// </summary>
public byte[] DataBytes
{
set
{
_DataBytes = value;
}
get
{
return _DataBytes;
}
}
}
}

C# Winform 支持Hex与ASCII输入和切换的文本框的更多相关文章

  1. powerpoint无法输入中文怎么办|ppt文本框无法输入中文解决办法

    powerpoint文本框无法输入中文的情况不知大家是否遇到过呢?反正小编是遇到过这样的情况的,简直是急煞人也!那么powerpoint无法输入中文时应该怎么办呢?本节内容中小编就为大家带来ppt文本 ...

  2. 实时监听input标签输入 实时监听文本框输入 避免中文输入法无法触发onkeyup事件的问题

    前言: 对于实时监听输入,这种需求大多数都是用于一个联想字提醒,智能提醒.大家都知道onkeydown,onkeypress,onkeyup的在监听中文输入法或者右键粘贴的时候都存在一些弊端,不是那么 ...

  3. JavaScript实现,控制一个文本框只能输入正整数,如输入不符合条件则文本框全部字体标红

    腾讯2014年研发职位笔试题Web前端方向简单题第一题. 代码: <html> <head> <title>test JavaScript</title> ...

  4. JS和vue文本框输入改变p标签的内容测试

    文本框输入,p标签的内容自动变成文本框的内容,如下是三种方法的测试: 方法1:JS里的onchange,当文本框内容改变事件,该事件里写的方法是,获取p标签本身,然后获取文本框的值,赋值给变量,最后给 ...

  5. 解决ie文本框不能输入和获取焦点问题

    解决办法:    从正常的机器上拷贝c:\windows\system32\mshtmled.dll到本机的system32目录下即可.或者从安装盘中提取该文件.    加载mshtmled.dll: ...

  6. JS添加删除一组文本框并对输入信息加以验证

    在做项目中遇到这样一个问题,就是我们需要添加几组数据到数据库,但是具体几组数据不确定,有客户来填写,比如我们需要添加打折策略,可能个策略有很多组方案,比如“满100打5折,满200打4折,满500打3 ...

  7. C# textbox中输入时加限制条件 // C#Winform下限制TextBox只能输入数字 // 才疏学浅(TextBox 小数点不能在首位+只能输入数字)

    textbox中输入时加限制条件 分类: C# winform2008-08-26 08:30 306人阅读 评论(0) 收藏 举报 textbox正则表达式object 1.用正则表达式! 2.使用 ...

  8. WinForm笔记一:文本框只允许输入数字

    在WinForm的文本框中,有时候只允许数字,而不能输入除数字以外的其他字符,要调用TextBox的KeyPress事件,代码如下: //只允许输入数字 if (e.KeyChar<'0'||e ...

  9. Winform文本框只能输入限定的文本

    比如WInform中的文本框只能输入数字活着字母和退格键,e.kaychar(按下键盘的值)

随机推荐

  1. php/ java/asp.net

    php大型网站用得多 企业级开发 java/asp.net用得多 这个很好理解 php 执行效率好 可塑性强 接近底层 java asp.net 封装了更多的东西,开发企业级业务 效率更高, 但是高性 ...

  2. 液晶常用接口“LVDS、TTL、RSDS、TMDS”技术原理介绍

    液晶常用接口“LVDS.TTL.RSDS.TMDS”技术原理介绍 1:Lvds Low-Voltage Differential Signaling 低压差分信号 1994年由美国国家半导体公司提出之 ...

  3. 2.1 linux中uboot移植

    -- --------------------------------------------------------------------------------------- (一)友善之臂介绍 ...

  4. Wince6 RIL层移植

    RIL移植: 因为不同的模组,支持的AT命令有所不同,或是格式不一样,还有就是返回不一样,我们有必要对不同的模组进行RIL驱动移植. 在Response.cpp,Msg.cpp等 文件中ParseXX ...

  5. js2word/html2word的简单实现

    js2word/html2word的简单实现 以C#描述如下:             StringBuilder sb = new StringBuilder();            sb.Ap ...

  6. MySQL全世界最流行的开源数据库软件

    誉天全国首推全球市场占有率第二的数据库——MySQL培训课程,阿里巴巴.新浪等知名企业正在使用MySQL数据库系统,而这方面的人才需求也是供不应求,誉天作为国内2014年首批ORACLE官方授权MyS ...

  7. POJ 3204 Ikki's Story I-Road Reconstruction (网络流关键边)

    [题意]给定一个N个节点M条边的网络流,求有多少条边,使得当增其中加任何一个边的容量后,整个网络的流将增加. 挺好的一道题,考察对网络流和增广路的理解. [思路] 首先关键边一定是满流边.那么对于一个 ...

  8. 【 D3.js 选择集与数据详解 — 5 】 处理模板的应用

    在[选择集与数据 - 4]一文中,介绍了一个update.enter.exit的处理模板,这个模板很常用,本文将通过一个例子来讲解其使用方法. 1. 模板 复习一下上一章提到的模板. //绑定数据后, ...

  9. CentOS 7 安装 tomcat7.0

    安装tomcat: [root@admin local]# cd /usr/local[root@admin local]# tar -zxv -f apache-tomcat-7.0.29.tar. ...

  10. window.location.search作用

    window.location.search.substr(1).split("&") 这里面的相关属性和时间还有参数能具体说明一下吗?window.location wi ...