C#自定义IP输入框控件

场景: 做一些网络设备应用时,需要有ip地址的输入,这就需要ip地址输入框控件

思路:

1 重写TextBox 为IpInputBox。

2 重写TextBox为SubIpInputBox

3 一个IpInputBox 添加4个SubIpInputBox 和3个Label

控件图:

具体代码:

主窗口文件   Dialog.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; 

namespace IP
{
  public delegate void FallBackEvent(IpInputBox box, int flag); 

  public partial class Dialog : Form
  {
    public Dialog()
    {
      InitializeComponent();
    } 

    private void Form1_Load(object sender, EventArgs e)
    {
      this.Controls.Add(ipBox);
      ipBox.Location = new Point(10,10);
    } 

    private IpInputBox ipBox = new IpInputBox(false);
  }
}

IpInputBox.cs 文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing; 

namespace IP
{
  public class IpInputBox :TextBox
  {
    private bool _isNetmask = false;
    public bool IsNetmask
    {
      get { return _isNetmask; }
      set { _isNetmask = value; }
    }
    public IpInputBox(bool isNetmask)
    {
      _isNetmask = isNetmask; 

      this.Size = new System.Drawing.Size(150, 25); 

      _dotLabel1.Text = ".";
      _dotLabel2.Text = ".";
      _dotLabel3.Text = "."; 

      _dotLabel1.Size = new System.Drawing.Size(10, 25);
      _dotLabel2.Size = new System.Drawing.Size(10, 25);
      _dotLabel3.Size = new System.Drawing.Size(10, 25); 

      _box1.IsNetmask = _isNetmask;
      _box2.IsNetmask = _isNetmask;
      _box3.IsNetmask = _isNetmask;
      _box4.IsNetmask = _isNetmask; 

      _box1.Flag = 1;
      _box2.Flag = 2;
      _box3.Flag = 3;
      _box4.Flag = 4; 

      this.Controls.Add(_box1);
      this.Controls.Add(_dotLabel1); 

      this.Controls.Add(_box2);
      this.Controls.Add(_dotLabel2); 

      this.Controls.Add(_box3);
      this.Controls.Add(_dotLabel3); 

      this.Controls.Add(_box4); 

      this.Font = new System.Drawing.Font(this.Font.Name, 11);
      _box1.Location = new System.Drawing.Point(-1, 2);
      _dotLabel1.Location = new System.Drawing.Point(29, 2);
      _box2.Location = new System.Drawing.Point(39, 2);
      _dotLabel2.Location = new System.Drawing.Point(69, 2);
      _box3.Location = new System.Drawing.Point(79, 2);
      _dotLabel3.Location = new System.Drawing.Point(109, 2);
      _box4.Location = new System.Drawing.Point(119, 2); 

      _box1.Box = this;
      _box2.Box = this;
      _box3.Box = this;
      _box4.Box = this;
    }
    public void FallBackEventFun(IpInputBox box, int flag)
    {
      switch (flag)
      {
        case 1:
          _box1.Focus();
          break;
        case 2:
          _box1.Focus();
          break;
        case 3:
          _box2.Focus(); ;
          break;
        case 4:
          _box3.Focus(); ;
          break;
      }
    } 

    private string _ipAddress = string.Empty;
    public void UpDateIpaddress()
    {
      try
      {
        string[] sArray = ipAddress.Split(new char[] { '.' });
        _box1.Text = sArray[0];
        _box2.Text = sArray[1];
        _box3.Text = sArray[2];
        _box4.Text = sArray[3];
      }
      catch (Exception exp)
      {
        MessageBox.Show("更新字符串失败:" + exp.Message);
      }
    } 

    /// <summary>
    /// 获取ip地址
    /// </summary>
    public string IpAddressString
    {
      get
      {
        string _ipStr1 = _box1.Text;
        string _ipStr2 = _box2.Text;
        string _ipStr3 = _box3.Text;
        string _ipStr4 = _box4.Text;
        string _ipDotStr = ".";
        _ipAddress = _ipStr1 + _ipDotStr + _ipStr2 + _ipDotStr + _ipStr3 + _ipDotStr + _ipStr4;
        return _ipAddress;
      }
      set
      {
        _ipAddress = value;
      }
    }
    private string ipAddress = string.Empty; 

    public string IpAddress
    {
      get { return ipAddress; }
      set { ipAddress = value; }
    } 

    private SubIpInputBox _box1 = new SubIpInputBox("");
    private SubIpInputBox _box2 = new SubIpInputBox("");
    private SubIpInputBox _box3 = new SubIpInputBox("");
    private SubIpInputBox _box4 = new SubIpInputBox(""); 

    private Label _dotLabel1 = new Label();
    private Label _dotLabel2 = new Label();
    private Label _dotLabel3 = new Label(); 

  }
}

SubIpInputBox.cs 文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Windows.Forms; 

namespace IP
{
  public class SubIpInputBox:TextBox
  {
      /// <summary>
      /// 判断是否是子网掩码,false表示ip地址,true表示子网掩码
      /// </summary>
      private bool _isNetmask = false;
      private bool _isSendKey = false;
      private System.ComponentModel.IContainer components;
      private int _flag = 0; 

      public int Flag
      {
        get { return _flag; }
        set { _flag = value; }
      } 

      /// <summary>
      ///
      /// </summary>
      public event FallBackEvent TextFallBackEvent; 

      //定义事件函数
      public void FallBackEventFun(int flag)
      {
        if (TextFallBackEvent != null)
        {
          TextFallBackEvent(box, this.Flag);
        }
      } 

      public bool IsNetmask
      {
        get { return _isNetmask; }
        set { _isNetmask = value; }
      } 

      /// <summary>
      /// 构造函数
      /// </summary>
      public SubIpInputBox(bool isNetmask)
      {
        _isNetmask = isNetmask;
        box = new IpInputBox(_isNetmask);
        this.Font = new System.Drawing.Font(this.Font.Name, 11);
        this.BorderStyle = System.Windows.Forms.BorderStyle.None;//去掉边框
        this.TextAlign = HorizontalAlignment.Center;//字体居中
        this.Size = new System.Drawing.Size(30, 25);
        this.MaxLength = 3;
      } 

      public SubIpInputBox(string str)
      {
        this.Text = str;
        this.Size = new System.Drawing.Size(30, 25);
        this.MaxLength = 3;
        this.BorderStyle = System.Windows.Forms.BorderStyle.None;//去掉边框
        this.TextAlign = HorizontalAlignment.Center;//字体居中
      } 

      private IpInputBox box;
      public IpInputBox Box
      {
        get { return box; }
        set { box = value; }
      } 

      protected override void OnKeyUp(KeyEventArgs e)
      {
        base.OnKeyUp(e); 

        if (this.Text == "")
        {
          if (e.KeyCode.ToString() == "Back")
          {
            this.TextFallBackEvent += new FallBackEvent(box.FallBackEventFun);
            this.FallBackEventFun(this.Flag);
          }
        }
      }
      protected override void OnKeyPress(KeyPressEventArgs e)
      {
        base.OnKeyPress(e); 

        //阻止从键盘输入键
        e.Handled = true; 

        if ((e.KeyChar >= '0' && e.KeyChar <= '9') || (e.KeyChar == (char)8))
        { 

          if ((e.KeyChar == (char)8))
          {
            e.Handled = false; return;
          }
          else
          {
            int len = this.Text.Length;
            if (len < 4)
            {
              if (len == 0 && e.KeyChar != '0')
              {
                e.Handled = false; return;
              }
              else if (len == 0)
              {
                if (this.Flag == 1 && this.IsNetmask == false)
                {
                  return;
                }
              }
              e.Handled = false; return;
            }
            else
            {
              // MessageBox.Show("编号最多只能输入3位数字!");
            }
          }
        }
        else if (e.KeyChar == '.')
        {
          //MessageBox.Show("编号只能输入数字!");
          if (this.Text.Length != 0)
          {
            // 如果输入 . 就执行 TAB 键
            SendKeys.SendWait("{TAB}");
          }
        }
        else if (this._isSendKey)
        {
          this.SelectAll();
        } 

      } 

      protected override void OnTextChanged(EventArgs e)
      { 

        try
        {
          string currentStr = this.Text;
          int currentNumber = Convert.ToInt32(currentStr);
          this.Text = currentNumber.ToString();
          this.SelectionStart = currentStr.Length;//设置光标在末尾
          if (_isNetmask == false)//表示ip地址
          { 

            if (currentNumber > 223 || (currentNumber == 0 && this.Flag == 1))
            {
              MessageBox.Show("你输入的" + currentStr + "不是有效数值,请指定一个介于1到223之间的数值!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Warning); 

              if (this.Flag == 1 && currentNumber == 0)
              {
                this.Text = "1";
              }
              else
              {
                this.Text = "223";
              }
              _isSendKey = true;
              this.Focus();
              this.SelectionStart = currentStr.Length;//设置光标在末尾
              this.SelectAll();
            }
            else
            {
              if (currentStr.Length == 3 && _isSendKey == false)
              {// 当输入的字符个数为3时,跳入另外一个输入框
                //MessageBox.Show("输入完毕");
                if (currentNumber == 0)
                {
                  this.Text = "";
                  MessageBox.Show("000");
                }
                SendKeys.SendWait("{TAB}");
              }
            } 

          }
          else//子网掩码
          {
            if (currentNumber > 255)
            {
              MessageBox.Show("你输入的" + currentStr + "不是有效数值,请指定一个介于0到255之间的数值!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Warning);
              this.Text = "255";
              this.Focus();
              this.SelectionStart = currentStr.Length;//设置光标在末尾
              this.SelectAll();
            }
            else
            {
              if (currentStr.Length == 3 && _isSendKey == false)
              {// 当输入的字符个数为3时,跳入另外一个输入框
                //MessageBox.Show("输入完毕");
                SendKeys.SendWait("{TAB}"); 

              }
            }
          }
        }
        catch
        {
          // 异常处理
        }
      } 

      private void InitializeComponent()
      {
        this.SuspendLayout();
        //
        // SubIpInputBox
        //
        this.TabIndexChanged += new System.EventHandler(this.SubTextBox_TabIndexChanged);
        this.ResumeLayout(false);
      }
      private void SubTextBox_TabIndexChanged(object sender, EventArgs e)
      { 

      }
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • WinForm IP地址输入框控件实现

    本文实例为大家分享了WinForm IP地址输入框控件的具体实现代码,供大家参考,具体内容如下 IPInput.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms; using System.Text.RegularE

  • C#自定义IP输入框控件

    场景: 做一些网络设备应用时,需要有ip地址的输入,这就需要ip地址输入框控件 思路: 1 重写TextBox 为IpInputBox. 2 重写TextBox为SubIpInputBox 3 一个IpInputBox 添加4个SubIpInputBox 和3个Label 控件图: 具体代码: 主窗口文件   Dialog.cs using System; using System.Collections.Generic; using System.ComponentModel; using S

  • Qt实现自定义验证码输入框控件的方法

    前言 本文实现了自定义的验证码输入框控件.控件包括图标.输入框.获取验证码按钮.验证码获取倒计时标签.支持鼠标点击获取验证码按钮后开始显示倒计时功能,倒计时为0时,才可以在此点击获取验证码按钮.效果如图: 主要的编程思想还是实现自定义控件的封装性和共用性. UI布局: 控件1:QWidget,实现整个控件的封装,这个控件使用水平布局,实现控件的水平摆放,同时,当其中一个控件隐藏时,位置会重新更新,实现在控件的后面只显示获取验证码和倒计时两个控件中的一个. 控件2:QLabel,实现展示盾牌图标.

  • WPF自定义选择年月控件详解

    本文实例为大家分享了WPF自定义选择年月控件的具体代码,供大家参考,具体内容如下 封装了一个选择年月的控件,XAML代码: <UserControl x:Class="SunCreate.CombatPlatform.Client.DateMonthPicker" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.micr

  • Android 带清除功能的输入框控件实例详解

    Android 带清除功能的输入框控件实例详解 今天,看到一个很好的自定义输入框控件,于是记录一下. 效果很好: 一,自定义一个类,名为ClearEditText package com.example.clearedittext; import android.content.Context; import android.graphics.drawable.Drawable; import android.text.Editable; import android.text.TextWatc

  • 浅析Angular19 自定义表单控件

    1 需求 当开发者需要一个特定的表单控件时就需要自己开发一个和默认提供的表单控件用法相似的控件来作为表单控件:自定义的表单控件必须考虑模型和视图之间的数据怎么进行交互 2 官方文档 -> 点击前往 Angular为开发者提供了ControlValueAccessor接口来辅助开发者构建自定义的表单控件,开发者只需要在自定义表单控件类中实现ControlValueAccessor接口中的方法就可以实现模型和视图之间的数据交互 interface ControlValueAccessor { wri

  • Angular使用ControlValueAccessor创建自定义表单控件

    在 Angular 自定义表单控件,有时你想要的输入不是标准的文本输入.选择或复选框.通过实现ControlValueAccessor 接口并将组件注册为 NG_VALUE_ACCESSOR,您可以将自定义表单控件无缝地集成到模板驱动或响应表单中,就像它是本地表单一样! ControlValueAccessor ControlValueAccessor 是一个接口,充当Angular API 和 DOM 元素之间的桥梁 ControlValueAccessor 是一个连接表单模型和视图(DOM元

  • Android自定义双向滑动控件

    本文实例为大家分享了Android自定义双向滑动控件的具体代码,供大家参考,具体内容如下 先看一下效果图 1.SeekBarPressure工具类 public class SeekBarPressure extends View {     private static final String TAG = "SeekBarPressure";     private static final int CLICK_ON_LOW = 1;      //点击在前滑块上     priv

  • 微信小程序 input输入框控件详解及实例(多种示例)

    微信小程序 input输入框控件 今天主要详写一下微信小程序中的Input输入框控件,输入框在程序中是最常见的,登录,注册,获取搜索框中的内容等等都需要,同时,还需要设置不同样式的输入框,今天的代码中都要相应的使用. 首先主页面中将登录的样式进行了简单展示和使用, 代码如下: <!--index.wxml--> <!--如果在同一个form表单中创建了多个input输入框,可以给给每个输入框,创建自己的 name="userName"属性,可以区别哪个输入框,并通过添

  • Android自定义播放器控件VideoView

    介绍 最近要使用播放器做一个简单的视频播放功能,开始学习VideoView,在横竖屏切换的时候碰到了点麻烦,不过在查阅资料后总算是解决了.在写VideoView播放视频时候定义控制的代码全写在Actvity里了,写完一看我靠代码好乱,于是就写了个自定义的播放器控件,支持指定大小,可以横竖屏切换,手动左右滑动快进快退.好了,下面开始. 效果图有点卡,我也不知道为啥..... VideoView介绍 这个是我们实现视频播放最主要的控件,详细的介绍大家百度就去看,这里介绍几个常用的方法. 用于播放视频

随机推荐