文本框中的三个点

Three dots in textbox

我有一个用于 IP 寻址的 C# 文本框;验证 IP 地址。但是,我试图限制用户可以为 IP 地址输入的数字和点数。这样可以限制错误。

我似乎可以输入一个点,我想将该数字增加到三个。我可以创建一个 "Regex.IsMatch" 并使用 "IPAddress" 进行验证,但我只是想限制用户在按下按钮继续之前可以输入的内容。

有办法吗?上网搜索也没有找到方法。

    string pattern = @"\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b";
    bool CKDots = Regex.IsMatch(TracertIP, pattern);

    private void txtTracerouteIP_KeyPress(object sender, KeyPressEventArgs e)
    {
        // Enter only numbers.
        if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && (e.KeyChar != '.'))
        {
            e.Handled = true;
        }
        // Only one dot, but I need three.
        //if ((e.KeyChar == '.') && ((sender as TextBox).Text.IndexOf('.') > -1))
        //{
        //    e.Handled = true;
        //}
    }

我们可以保持简单并使用验证事件:

    this.txtTracerouteIP.Validating += this.txtTracerouteIP_Validating;

然后:

    string pattern = @"^\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b$";

    private void txtTracerouteIP_Validating(object sender, CancelEventArgs e)
    {
        if (!Regex.IsMatch(txtTracerouteIP.Text, pattern))
        {
            MessageBox.Show("IP Address must be in the format '255.255.255.255'!");
            txtTracerouteIP.SelectAll();
            e.Cancel = true;
        }
    }

因为 MaskedTextBox 不是一个选项,而您更喜欢 TextBox,那么这可能会导致一些事情。

using System;
using System.Linq;
using System.Windows.Forms;
using System.ComponentModel;

namespace SomeNamespace
{
    [DesignerCategory("Code")]
    public class IPTextBox : TextBox
    {
        #region Constructors

        public IPTextBox() : base() { }

        #endregion

        #region Public Properties

        [Browsable(false)]
        public bool IsValidIP => IsValidInput(Text, true);

        #endregion

        #region Private Methods

        private bool IsValidInput() => IsValidInput(Text);

        private bool IsValidInput(string input, bool full = false)
        {
            var split = input.Split('.');
            var parts = split.Where(x => int.TryParse(x, out _));

            return !input.StartsWith(".")
                && !input.EndsWith("..")
                && !split.Any(x => x.Length > 1 && x.StartsWith("0"))
                && (full ? parts.Count() == 4 : split.Count() < 5)
                && parts.All(x => int.Parse(x) < 256);
        }

        #endregion

        #region Base

        protected override void OnTextChanged(EventArgs e)
        {
            if (Text.Trim().Length > 0 && !IsValidInput())
            {
                SendKeys.SendWait("{BS}");
                OnInvalidInput();
            }
            else
                base.OnTextChanged(e);
        }

        protected override void OnKeyPress(KeyPressEventArgs e)
        {           
            if (!char.IsControl(e.KeyChar)
                && !char.IsDigit(e.KeyChar)
                && e.KeyChar != '.')
            {
                e.Handled = true;
                OnInvalidInput();
            }
            else
                base.OnKeyPress(e);
        }

        private const int WM_PASTE = 0x0302;        

        protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
                case WM_PASTE:
                    if (!IsValidInput(Clipboard.GetText()))
                        return;
                    break;
                default:
                    break;
            }
            base.WndProc(ref m);
        }

        #endregion

        #region Custom Events

        public event EventHandler InvalidInput;

        protected virtual void OnInvalidInput()
        {
            var h = InvalidInput;
            h?.Invoke(this, EventArgs.Empty);
        }

        #endregion
    }
}

Steps & Description


  • TextBox 控件派生新的 class。

  • 覆盖 OnKeyPress 方法以仅允许控制、数字和 键。

  • 覆盖 OnTextChanged 方法以通过 IsValidInput 函数验证修改后的文本,如果函数 returns [=17= 则删除最后输入的字符].

  • IsValidInput 函数检查输入的文本是否可以生成有效的 IP 地址或其中的一部分。

  • IsValidIPread-only属性returns 文本是否为有效IP地址。如您所知,如果您通过 1192.168IPAddress.TryParse(..) 也会 return true,因为它将它们解析为 0.0.0.1192.0.0.168分别。所以这里帮不上忙。

  • 每当按下无效键并且 Text 不构成有效 IP 地址或其一部分时,将引发自定义事件 InvalidInput。因此,可以在实现中处理事件以在必要时提醒用户。

就这些了。

Related