最近一直在做一个支持串口,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. WCF 传输的序列化

    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService”.[ServiceContract]public interface IService{ [O ...

  2. day 2014-04-13

    crystal 10:00:40 米多爸爸 11:51:47 很滋润嘛.一般有送股题材的股票都会在送股消息公告之前炒上一阵子,真到了题材兑现就涨不动了,也有些会在除权后走一波填权行情.现在不是牛市,后 ...

  3. TextView设置样式的3种方式

    1,直接在<TextView>中设置 <TextView android:id="@+id/tv_badge_view_count" android:layout ...

  4. poj1151Atlantis(离散化+扫描线)

    http://poj.org/problem?id=1151 http://www.cnblogs.com/kane0526/archive/2013/02/26/2934214.html这篇博客写的 ...

  5. 变量赋值(引用) php内核的实现(二)

    <?php $a=1; $b=&$a; $c=2; $a=&$c; echo $a."\n"; echo $b; 2 1 结论: 首先保存 左值的内存地址, ...

  6. poj2436,poj3659,poj2430

    这两题都体现了dp的核心:状态 dp做多就发现,状态一设计出来,后面的什么都迎刃而解了(当然需要优化的还要动动脑筋): 先说比较简单的: poj2436 由题得知病毒种数<=15很小,于是我们就 ...

  7. CodeForces Round #290 Div.2

    A. Fox And Snake 代码可能有点挫,但能够快速A掉就够了. #include <cstdio> int main() { //freopen("in.txt&quo ...

  8. CSS布局中——导航是非常常见的

    导航绝对是页面布局中最常见的,为了不用每次去写,稍微贴个简单的导航模版出来,方便以后使用. <title>CSS菜单</title> <style type=" ...

  9. 什么是MBeanServer

    什么是MBeanServer MBeanServer是一个包含所有注册MBean的仓库.它是JMX代理层的核心.JMX1.0规范提供一个接口叫 javax.management.MBeanServer ...

  10. Jmeter初步使用--Jmeter安装与使用

    由于jmeter是开源的性能测试工具,但是使用的人较少,网络上相关资料不全面,需要自己去揣摩,因此,小编就把自己在用Jmeter时的一些小结总结出来.而loadrunner工具是商业软件,网上通常都是 ...