Три точки в текстовом поле - PullRequest
2 голосов
/ 20 марта 2020

У меня есть текстовое поле C# для IP-адресации; проверка IP-адреса. Однако я пытаюсь ограничить число и количество точек, которые пользователь может ввести для IP-адреса. Таким образом, это ограничивает ошибки.

Кажется, я могу ввести одну точку, я хотел бы увеличить это число до трех. Я могу создать «Regex.IsMatch» и проверить его с помощью «IP-адреса», но я просто пытаюсь ограничить то, что пользователь может ввести, прежде чем нажать кнопку, чтобы продолжить.

Есть ли способ сделать это? Поиск по Inte rnet не нашел способа сделать это.

    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;
        //}
    }

Ответы [ 2 ]

0 голосов
/ 21 марта 2020

Поскольку MaskedTextBox не вариант, и вы предпочитаете TextBox, то, возможно, это приведет к чему-то.

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

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

        public IPTextBox() : base() { }

        #endregion

        #region Public Properties

        [Browsable(false)]
        public bool IsValidIP { get { return IsValidInput(true); } }

        #endregion

        #region Private Methods

        private readonly Func<string, bool> IsValidIP4Part = x =>
        { return x.Length > 1 && x.StartsWith("0") ? false
            : int.TryParse(x, out int y) && y < 256; };

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

            return !Text.StartsWith(".") &&
                !Text.EndsWith("..") &&
                split.Length < 5 &&
                parts.All(x => IsValidIP4Part(x));
        }

        #endregion

        #region Base

        protected override void OnTextChanged(EventArgs e)
        {
            base.OnTextChanged(e);

            if (!IsValidInput())
            {
                SendKeys.SendWait("{BS}");
                OnInvalidInput();
            }            
        }

        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            base.OnKeyPress(e);

            if (!char.IsControl(e.KeyChar) &&
                !char.IsDigit(e.KeyChar) &&
                e.KeyChar != '.')
            {
                e.Handled = true;
                OnInvalidInput();
            }                
        }

        #endregion

        #region Custom Events

        public event EventHandler InvalidInput;

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

        #endregion
    }
}

Шаги и описание


  • Извлечь новый класс из TextBox control.

  • Переопределить метод OnKeyPress, чтобы разрешить управление, Только клавиши di git и . .

  • Переопределите метод OnTextChanged, чтобы проверить измененный текст с помощью функции IsValidInput и удалить последний введенный символ, если функция возвращает false.

  • Функция IsValidInput проверяет, может ли введенный текст создать действительный IP-адрес или его часть.

  • Делегат IsValidIP4Part получает части IP из функции IsValidInput и проверяет, являются ли они действительными частями IP4.

  • IsValidIP только для чтения свойство возвращает, является ли текст действительным IP-адресом. Как вы знаете, IPAddress.TryParse(..) также вернет true, если вы передадите, например, 1 или 192.168, потому что он анализирует их как 0.0.0.1 и 192.0.0.168 соответственно. Так что здесь это не поможет.

  • Настраиваемое событие InvalidInput возникает при каждом нажатии недопустимой клавиши и если Text не образует действительный IP-адрес или часть этого Таким образом, событие может быть обработано в реализации, чтобы при необходимости предупредить пользователя.

Вот и все.

IP Address TextBox

Редактировать: недопустимое выражение выражение 'int' Исправить ошибку


Заменить:

private readonly Func<string, bool> IsValidIP4Part = x =>
{
    return x.Length > 1 && x.StartsWith("0") ? false
        : int.TryParse(x, out int y) && y < 256;
};

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

    return !Text.StartsWith(".") &&
        !Text.EndsWith("..") &&
        split.Length < 5 &&
        parts.All(x => IsValidIP4Part(x));
}

На:

private bool IsValidIP4Part(string input)
{
    int y;
    return input.Length > 1 && input.StartsWith("0") ? false
        : int.TryParse(input, out y) && y < 256;
}

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

    return !Text.StartsWith(".") &&
        !Text.EndsWith("..") &&
        split.Length < 5 &&
        parts.All(x => IsValidIP4Part(x));
}

Связано


Как вводить текстовые поля в произвольном формате?

0 голосов
/ 20 марта 2020

Мы можем сохранить простоту и использовать проверяющее событие:

    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;
        }
    }
...