C# WinForm自定义IP地址输入框控件

1.概述

最近在做使用网络的软件时,涉及了输入IP地址和获取IP地址,WinForm界面中直接用TextBox或四个TextBox控件总觉不象回事,后来改用WinForm自带的MaskedTextBox控件,虽然通过设置掩码可以实现IP地址输入,但是发现与Windows操作系统中设置IP有很大差别,比如在第一个IP段删除地址,后面三个IP段的地址会跟着向左移动,另外,假如某一段IP地址只有一位,它显示的不居中,感觉很别扭,所以MaskedTextBox控件体验感不好。因此决定模仿Windows系统IP地址框的样式及功能,自己写一个自定义的IP地址框。后来在写完后,又把它改写成了一个自定义的,可以在VS工具箱显示的控件。我把写好的控件上传了,是在.Net Framework 4.5.2下编译的,如果大家直接用可以去免费下载,地址:https://download.csdn.net/download/b07lxh/88410928?spm=1001.2014.3001.5503(如需要其他版本,请留言联系),其中设置和读取IP地址的属性是IPText。如果想了解实现过程,可以阅读以下内容。

2.步骤

1、组成元素:由一个Panel控件,四个TextBox控件和三个Label控件组成,将其背景色设备为白色.。Panel的边框BorderStyle设置为FixedSingle,TextBox和Lable的边框设置为None。TextBox的Text清空,同时设置输入文本对齐方式TextAlign为Center居中输入,Label的Text赋值为句点,这样外观就得Windows的IP地址框了。
2、需要解决的问题:Windows系统的IP框具有以下功能,一是只能输入数字;二是输入数字不符合IP地址规则就要报错误提示;三是按空格键,句点,箭头向右方向键(焦点在一段IP输入框尾部,除第四个IP输入段)会进入下一个IP输入段;四是当焦点在一段IP输入框首时(除第一段IP输入段),按箭头向左方向键、向左删除键(Backspace),会进入上一个IP输入段;五是第四个IP输入段,当输入IP地址的数字够了三位(合规的IP地址)后,会进入下一个IP输入段;六是第一个IP输入段的范围是1-223,第四个IP输入段的范围是1 - 254(虽然Windows的IP设置允许0 - 255,但是0表示是网络地址,255是广播地址,在实际应用中是不会使用的)。
我们使用的四个TextBox来表示IP地址的四个段,以上六点,单个TextBox文本控件除了只能输入数字和IP地址范围合规校验外,其他按相应的键进行跨文本框是无法实现的,所以要重点解决这些问题。这里我们就考虑用TextBox控件的KeyPress,KeyUp,KeyDown和Leave(失去焦点)事件了。也许大家会问,为什么会用到4个事件,用常用的KeyPress解决不了吗?答案是,真解决不了,首先左右箭头方向键在KeyPress中就捕获不到,其次用KeyDown捕获到键,将其e.Handled设置为true和KeyPress事件中的e.Handled=true是不一样的,KeyDown中的键还是要显示相应的按键字符的,起不到阻止显示作用,如下图,微软官方解释:
在这里插入图片描述
如果还没有解释清楚,我就说用这四个事件的作用吧,KeyPress起到“只能输入数字/Backspace删除键/左右方向键/空格/句点键,并且输入句点和空格进入下一个IP段,Backspace键删除完一个IP段后进入前一个IP段”的作用,KeyDown起到“左右方向键跨四个IP段的移动方法”的作用,KeyUp起到“输入IP过程中检验IP是否合法,并且在输入3位后自动进入下一个IP地址框”的作用,Leave起到“IP文本框失去焦点后检查IP合法性(主要是第一个IP段和第四个IP段不能为0),并且组合四个IP输入段,形成最终的IP地址”的作用。
我们将最终要获取到的IP放在了Leave事件中,因为失去焦点后,我们认为IP地址输入完成了。
3、自定义控件
在完成以上代码后,这个IP地址输入框也就能实现IP地址输入和获取了,功能也就已经实现,但是以后还要再用,那又会面临一堆代码,所以我想把它做成自定义的一个控件,直接放在VS的工具箱里,和其它控件一样使用,那该如何做呢?
首先打开VS,新建一个.NetFrameWork类库,如下图:
在这里插入图片描述
自定义类库名称,我定义的是IPTextBox,确定后VS生成了IPTextBox的命名空间,下面有个Class1的类,没有用,可以删除,在“解决方案资源管理器”中的IPTextBox点右键,如下图:
在这里插入图片描述

点击新建项后,选择“用户控件”,如下图:
在这里插入图片描述

控件名称起好后(我起的是IPTextBoxControl),点击“添加”,然后就出现了自定义控件的基础控件IPTextBoxControl,实际它就是一个Form控件,我想大家都已经很了解了,如下图:



然后我把上面做好的Panel控件,四个TextBox控件和三个句点的Label控件粘过来,再调整大小到合适的尺寸,把相应的KeyPress,KeyDown,KeyUp,Leave事件再拷贝过来,跟这个自定义的"Form"(IPTextBoxControl)的KeyPress等事件关联起来。
3.1、自定义控件需要考虑的问题:上面完成的IP地址输入框已经具备基本功能了,但是要作为一个整体控件使用,就需要考虑使用它的一些其他用途,我这里考虑了一是整体控件的可缩放性,来满足控件的大小调整,二是字体和字体的颜色,三是控件的背景颜色(Panel和Label设置为一同变化),四是IP地址输入框的背景颜色(四个TextBox的背景颜色)。第一个可缩放性,需要用到控件跟随窗体变化而等比例变化,可以参考我另一篇文章“C# WinForm窗口控件随窗口变化而等比例变化”,第二和第三个可以通过上图“Form”(IPTextBoxControl)的属性窗口的相应属性来实现(需要将两者用事件进行关联),第四个IP地址输入框背景需要自定义一个属性,并新增在控件的属性窗口中,代码如下:

        #region 自定义IPTextBox背景颜色属性,在控制属性窗口中显示
        
        private Color _ipTextBoxBackgroundColor = Color.White;
        [Browsable(true)]//在属性窗口中显示
        [Category("IpTextBox"), Description("IP地址框背景色")]

        public Color IpTextBoxBackgroundColor
        {
            get { return _ipTextBoxBackgroundColor; }

            set
            {
                _ipTextBoxBackgroundColor = value;
                this.IP1TextBox.BackColor = _ipTextBoxBackgroundColor;
                this.IP2TextBox.BackColor = _ipTextBoxBackgroundColor;
                this.IP3TextBox.BackColor = _ipTextBoxBackgroundColor;
                this.IP4TextBox.BackColor = _ipTextBoxBackgroundColor;
            }
        }
        
        #endregion

[Browsable(true)]标签是让该属性在调用此控件的属性窗口中显示(而在本次制作它的属性窗口中是不能显示的),Category(“IpTextBox”)是在属性窗口中自定义了一个标签,如果改为Category(“Appearance”),则会出现在属性窗口的“外观”标签下。
在这里插入图片描述
3.2、IP地址获取与赋值:以上所说的基本上完成了自定义控件的制作,最后就是获取和设置这个自定义的控件IP地址。同样我们将IP地址设置为在属性窗口可以显示的属性,代码如下:

#region IP地址
        private string _ip = "127.0.0.1";
        [Browsable(true)]
        [Description("IP地址,IPV4标准格式"),Category("IPText")]
        public string IPText
        {
            get { return _ip; }
            set
            {
                try
                {
                    string[] ipd = value.Split('.');
                    if (ipd.Length != 4)
                        throw new Exception();
                    if (int.Parse(ipd[0]) <= 0 || int.Parse(ipd[0]) > 223)
                        throw new Exception();
                    if (int.Parse(ipd[1]) < 0 || int.Parse(ipd[1]) > 255)
                        throw new Exception();
                    if (int.Parse(ipd[2]) < 0 || int.Parse(ipd[2]) > 255)
                        throw new Exception();
                    if (int.Parse(ipd[3]) <= 0 || int.Parse(ipd[3]) >= 255)
                        throw new Exception();

                    IP1TextBox.Text = ipd[0];
                    IP2TextBox.Text = ipd[1];
                    IP3TextBox.Text = ipd[2];
                    IP4TextBox.Text = ipd[3];

                    _ip = value;
                }
                catch
                {
                    _ip = "127.0.0.1";
                    IP1TextBox.Text = "127";
                    IP2TextBox.Text = "0";
                    IP3TextBox.Text = "0";
                    IP4TextBox.Text = "1";
                }
            }
        }
        #endregion

可以看出,设置IP地址有误的话,会自动采用默认值“127.0.0.1”,获取IP地址就是我们上面说的Leave事件中给出的IP地址,它的类型是字符串,格式是标准的IPV4格式。
3.3、生成dll文件
在完成以上工作后,我们按Ctrl+Shift+B,编译生成dll文件,如果直接按F5,虽然也生成dll文件,但有可能会提示错误,因为它不是可执行的exe程序。
4、调用控件
在新建的WinForm项目中,把上面生成的dll文件引用了,就会在工具箱中显示出来,跟其他VS控件一样,直接拖入窗口使用即可。

说明

本文主要是说明如何制作和Windows系统一样的IP地址控件和如何制作自定义控件,文字虽然多,没有具体的代码和操作步骤,但是说明了具体实现的思路,我相信大家看了后自己是能写好的,如果真需要源代码,那么可以留言与我。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 41
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 41
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值