当前位置:编程学习 > C#/ASP.NET >>

C# Winform 支持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;  
                        }  
                    }  
                }
补充:软件开发 , C# ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,