【问题标题】:IP Address in a MaskedTextBox?MaskedTextBox 中的 IP 地址?
【发布时间】:2016-04-21 02:51:02
【问题描述】:

如何使用 MaskedTextBox 防止用户输入无效的 IP 地址? (我希望它的行为就像 Windows 一样)。

【问题讨论】:

  • 为什么不直接读取值并为用户省点麻烦呢?永远不要让用户做你能为他们做的事情。

标签: c# .net maskedtextbox


【解决方案1】:

比其他答案简单得多:

使用 System.Net.IPAddress 和 System.Windows.Forms.MaskedTextBox

设置 MaskedTextBox 的以下属性:

MaskedTextBox.Mask = ###.###.###.###
MaskedTextBox.ValidatingType = typeof(System.Net.IPAddress);

只要文本框正在验证,就会引发事件 MaskedTextBox.TypeValidationCompleted。 事件参数显示如下:

  • 输入的文本是否可以作为 IP 地址? (= System.Net.IPAddress.TryParse 是否返回正常)
  • 以字符串形式描述错误
  • 解析的值(= System.NET.IpAddress 的一个对象
  • 解析值的类型。如果您有多个具有不同掩码的 MaskedTextBox,则需要

收到此事件后,您可以决定是使用该值还是通知用户该值有什么问题。

【讨论】:

  • 不起作用。仅适用于 123.123.123.123 - 即所有字符都存在。 “123.4.5.6”的IP地址将显示为“123.456..”
  • 订阅事件 KeyDown 并在操作员按下点/分号/逗号/右箭头/制表符等时以您想要的输入方式做出反应。
  • 还有 .可能应该是转义文字...“\。”
  • cb88:如果您将其键入为字符串,则应将其转义。但是,在 Visual Studio Designer 属性中,您不会转义这些字符,输入是文本框中的文本,软件会为您转义
【解决方案2】:

试试这个:

IPAddress ipAddress;
if (IPAddress.TryParse(maskedTextBoxY.Text, out ipAddress))
{
    //valid ip
 }
else
 {
    //is not valid ip
}

注意:要使用它,您需要导入 System.Net 命名空间:

using System.Net;

【讨论】:

    【解决方案3】:

    最好使用 REGEX 来验证用户输入。这是一个例子:

             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";
    
            string ip1 = "192.168.0.1";
            string ip2 = "302.0.0.1";
    
            Regex.IsMatch(ip1, pattern); // returns true
            Regex.IsMatch(ip2, pattern); // returns false
    

    【讨论】:

    • 嗯,从什么时候开始?这根本不能回答问题。 -1
    • @minitech - 我相信 Woot4Moo 指的是关于正则表达式的旧见 - 请参阅 codinghorror.com/blog/2008/06/…
    • @WillChesterfield:我指的是 Dan 的帖子,而不是 Woot4Moo 的评论。 System.Net.IPAddress.TryParse 要好得多。
    【解决方案4】:

    将掩码设置为:###.###.###.###

    会这样显示:

    【讨论】:

    • @Woot4Moo 我不认为可以用一个面具来完成。您需要监听按键并处理允许/不允许的字符
    • 正确,MaskedTextBox 不允许您直接进行复杂的验证。您可以使用 KeyPress 事件来读取用户输入并确定它是否有效。正确的正则表达式确实有助于完成这项任务。
    【解决方案5】:

    这个问题还没有复杂的解决方案。我认为@HaraldDutch 的答案是最接近的,但它不是用空格字符输入的。 使用附加说明:

    IPAdressBox.ResetOnSpace = false;
    

    大体上解决了问题,但更复杂的是使用 Parse 方法实现自己的自定义数据类型。

                public class IPValidator
                {
                    public static IPValidator Parse(string input)
                    {
                        Regex regexpr = new Regex(@" ");
                        Match match = regexpr.Match(input);
                        if (match.Success)
                            return new IPValidator();
                        else throw new ArgumentException(input);
                    }
                }
    

    其中 regexpr 是验证 IP 的特定表达式。之后它可以用作ValidatingType:

     IPAdressBox.ValidatingType = typeof(IPValidator);
    

    【讨论】:

      【解决方案6】:

      我制作了一个模仿 Windows 的 IP 屏蔽文本框。

      具有相同的宽度,高度,防止用户输入> 255个值,跳框等... 如果您仍然需要它并想尝试一下,就在这里:

      https://github.com/RuvenSalamon/IP-MaskedTextBox

      (我不知道这算不算自我推销,但它是开源的,所以我认为没关系。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-31
        • 2016-12-06
        • 2011-10-13
        • 2010-11-17
        • 1970-01-01
        相关资源
        最近更新 更多