gpt4 book ai didi

c# - 文本框中的三个点

转载 作者:行者123 更新时间:2023-12-05 06:19:43 27 4
gpt4 key购买 nike

我有一个用于 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;
//}
}

最佳答案

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 派生一个新类控制。

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

  • 覆盖 OnTextChanged通过 IsValidInput 验证修改后的文本的方法函数,如果函数返回 false,则删除最后输入的字符.

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

  • IsValidIP只读属性返回文本是否为有效的 IP 地址。如您所知,IPAddress.TryParse(..)还将返回 true例如,如果您通过 1192.168因为它将它们解析为 0.0.0.1192.0.0.168分别。所以它在这里无济于事。

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

就是这样。

IP Address TextBox

Related


How to TextBox inputs of custom format?

关于c# - 文本框中的三个点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60765586/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com