文本框中的三个点
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 地址或其中的一部分。
IsValidIP
read-only属性returns 文本是否为有效IP地址。如您所知,如果您通过 1
或 192.168
,IPAddress.TryParse(..)
也会 return true
,因为它将它们解析为 0.0.0.1
和 192.0.0.168
分别。所以这里帮不上忙。
每当按下无效键并且 Text
不构成有效 IP 地址或其一部分时,将引发自定义事件 InvalidInput
。因此,可以在实现中处理事件以在必要时提醒用户。
就这些了。
Related
▶
我有一个用于 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 地址或其中的一部分。IsValidIP
read-only属性returns 文本是否为有效IP地址。如您所知,如果您通过1
或192.168
,IPAddress.TryParse(..)
也会 returntrue
,因为它将它们解析为0.0.0.1
和192.0.0.168
分别。所以这里帮不上忙。每当按下无效键并且
Text
不构成有效 IP 地址或其一部分时,将引发自定义事件InvalidInput
。因此,可以在实现中处理事件以在必要时提醒用户。
就这些了。
Related
▶