【发布时间】:2016-04-21 02:51:02
【问题描述】:
如何使用 MaskedTextBox 防止用户输入无效的 IP 地址? (我希望它的行为就像 Windows 一样)。
【问题讨论】:
-
为什么不直接读取值并为用户省点麻烦呢?永远不要让用户做你能为他们做的事情。
标签: c# .net maskedtextbox
如何使用 MaskedTextBox 防止用户输入无效的 IP 地址? (我希望它的行为就像 Windows 一样)。
【问题讨论】:
标签: c# .net maskedtextbox
比其他答案简单得多:
使用 System.Net.IPAddress 和 System.Windows.Forms.MaskedTextBox
设置 MaskedTextBox 的以下属性:
MaskedTextBox.Mask = ###.###.###.###
MaskedTextBox.ValidatingType = typeof(System.Net.IPAddress);
只要文本框正在验证,就会引发事件 MaskedTextBox.TypeValidationCompleted。 事件参数显示如下:
收到此事件后,您可以决定是使用该值还是通知用户该值有什么问题。
【讨论】:
试试这个:
IPAddress ipAddress;
if (IPAddress.TryParse(maskedTextBoxY.Text, out ipAddress))
{
//valid ip
}
else
{
//is not valid ip
}
注意:要使用它,您需要导入 System.Net 命名空间:
using System.Net;
【讨论】:
最好使用 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
【讨论】:
System.Net.IPAddress.TryParse 要好得多。
将掩码设置为:###.###.###.###
会这样显示:
【讨论】:
这个问题还没有复杂的解决方案。我认为@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);
【讨论】:
我制作了一个模仿 Windows 的 IP 屏蔽文本框。
具有相同的宽度,高度,防止用户输入> 255个值,跳框等... 如果您仍然需要它并想尝试一下,就在这里:
https://github.com/RuvenSalamon/IP-MaskedTextBox
(我不知道这算不算自我推销,但它是开源的,所以我认为没关系。)
【讨论】: