思路

在现有的textbox控件中,添加4个子textbox(IP各段)、3个label(3个点)、1个panel;以达到IP输入控件的效果。

2015-10-04_164432.png
TIM截图20190418195447.png

实现效果

  1. 不会出现选中父IP控件的情况
  2. 不会出现子IP控件始终在顶部的情况
  3. 不会出现子控件遮罩父控件的情况
  4. IP地址第一位不大于223,其余不大于255(这个在下列代码中未呈现);子网掩码均不大于255
  5. 当一段IP输入等于3位数时,自动跳至下一段
  6. 当按下.时自动跳至下一段
  7. 当前段已被删除空时,自动跳至上一段
  8. 添加CIDR模式
  9. 添加边框效果
  10. Focus当前为空的子框
  11. 任一子框为空时,返回空

完整代码

  public class SubIPBox
    {
        private TextBox[] _subIpBox;
        private Label[] _lbl_dot;
        private Panel _parentControl;
        private Color panelBorderColor = Color.FromArgb(122, 122, 122);

        public SubIPBox()
        {
            _subIpBox = new TextBox[5];
            _lbl_dot = new Label[4];
        }

        /// <summary>
        /// IP值
        /// 点分十进制形式
        /// </summary>
        public string Text
        {
            get { return mergeIP(); }
            set { splitIP(value); }
        }
        /// <summary>
        /// 获得焦点
        /// 当前为空的IP字框获得焦点
        /// </summary>
        public void Focus()
        {
            foreach (TextBox tb in _subIpBox)
                if (tb.Text.Equals(string.Empty))
                {
                    tb.Focus();
                    break;
                }
        }
        /// <summary>
        /// CIDR
        /// </summary>
        public string CIDR
        {
            get { return _subIpBox[4].Text; }
            set { _subIpBox[4].Text = value; }
        }
        /// <summary>
        /// 合并各段IP内容
        /// 其中一段为空时,返回空字符
        /// </summary>
        /// <returns>点分十进制</returns>
        private string mergeIP()
        {