最近一直在做一个支持串口,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. System.Drawing.Design.UITypeEditor自定义控件属性GetEditStyle(ITypeDescriptorContext context),EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.C ...

  2. poj3378

    统计长度为5的上升序列个数, 容易想到O(n^2)的dp f[k,i]:=Σf[k-1,j] (1<=j<i,a[i]>a[j]) ans:=Σf[5,i] 但是显然会超时,需要考虑 ...

  3. SCOI2010游戏

    发现这题的并查集做法真是惊呆了 不过似乎匹配跑得更快? 对于一个联通块,假如不含环(就是一棵树),那么必定可以满足其中任意的p-1个点. 对于一个联通块,假如含环,那么必定全部的p个点都能满足. 那么 ...

  4. (十二)学习CSS之box-sizing 属性

    参考:http://www.w3school.com.cn/cssref/pr_box-sizing.asp CSS3 box-sizing 属性 定义和用法 box-sizing 属性允许您以特定的 ...

  5. 27、Service

    1服务可以通过startservice的方法 开启.通过stopservice的方法 停止. 服务有一个特点: 只会一次onCreate()方法一旦被创建出来,以后oncreate() 就不会再被执行 ...

  6. Linux(ubuntu)下安装JDK、Tomcat

    一.安装jdk 1)首先以root用户登录进去,在根目录下建立opt的目录,我们将下载的东西都放到该目录下去. 2)下载j2sdk ,如jdk-6u31-linux-i586.bin 下载地址如下ht ...

  7. javascript 的 split用法

    var array = "200,400,300".split(","); var nums = [ ]; for (var i=0 ; i< array ...

  8. 用Python操作Excel2007 及以上的版本读写,来自官方的Demo

    大牛请略过,新手可以参考,具体见下面的代码注释, 另外一个问题,想学习这个语言,最好还是英语牛一些,可以去官网多看看有用的类库,汉语的资料不是很全 #运行环境 3.4,下面这个操作Excel的包是针对 ...

  9. 简易博客编辑器:玩转document.execCommand命令

    xhEditor是基于jQuery开发的跨平台轻量可视化XHTML编辑器,基于LGPL开源协议发布.今天就把它山寨一下. 上几张图,看看效果: 先做出菜单部分:发现是一张背景图片,所以用图片映射的方法 ...

  10. Yum本地源配置

    1.mount -t auto /dev/cdrom /mnt      使用光驱 mount -t iso9660 -o loop /home/software/rhel-server-6.4-x8 ...