我只是想知道是否有人遇到过如何在 C# 中为工具条组合框应用输入掩码?
随着时间的推移,我的下拉框会填充 IP 地址,我想限制用户能够写入的内容(例如:只能输入 3 个“。”,只能输入数字等)。
因此,如果有人能够提供帮助,我将不胜感激!
提前致谢。
编辑
我的设计已经改变,所以我现在需要一个 ToolStripComboBox
我只是想知道是否有人遇到过如何在 C# 中为工具条组合框应用输入掩码?
随着时间的推移,我的下拉框会填充 IP 地址,我想限制用户能够写入的内容(例如:只能输入 3 个“。”,只能输入数字等)。
因此,如果有人能够提供帮助,我将不胜感激!
提前致谢。
编辑
我的设计已经改变,所以我现在需要一个 ToolStripComboBox
您可以尝试捕获KeyUp 事件,然后检查输入是否有效。如果不将其恢复为最后一个有效输入。您可能希望对Validating事件执行类似的操作(确保CausesValidation为真)。
另一种选择是创建一个MaskedTextBox并放置它,使其覆盖下拉菜单的文本框部分。然后,您需要连接事件,以便两个表单控件保持同步。
您还可以查看ErrorProvider类。
还有其他几种方法(例如每 0.3 秒运行一次的计时器),但这些方法通常会消耗性能或难以维护。
正则表达式注释更新:
如果我要这样做,我可能会使用正则表达式,或者我可能会手动解析字符串。无论哪种方式,KeyUp 和 Validating 事件都是我检查控件验证的地方。KeyUp 事件让我可以选择在输入时进行检查,而 Validating 事件让我可以验证控件何时失去焦点。您使用哪种取决于您想要的用户体验。
如果您不使用 KeyUp 事件进行验证,您可以添加一个计时器,该计时器在最后一次按键后运行 5 秒。这样,控件就不必失去焦点来显示错误。
已编辑问题和评论的更新:
您不能使用Format
事件,因为您的问题是关于如何格式化用户输入,而不是如何将内容添加到列表中。因此,该解决方案不适ToolStripComboBox
用于ComboBox
.
阅读文档后ToolStripControlHost
,您也许可以转换ToolStripComboBox
为ComboBox
. 如果没有,那么您可以使用 将ToolStripControlHost
放置ComboBox
到您的表单上。 - 这是不正确或不必要的,请参阅报价下方的更新。
ToolStripControlHost 是 ToolStripComboBox、ToolStripTextBox 和 ToolStripProgressBar 的抽象基类。ToolStripControlHost 可以通过两种方式托管其他控件,包括自定义控件:
使用派生自 Control 的类构造 ToolStripControlHost。要完全访问托管控件和属性,您必须将 Control 属性转换回它所代表的实际类。
扩展 ToolStripControlHost,并在继承类的默认构造函数中,调用基类构造函数,传递从 Control 派生的类。此选项允许您包装常用控件方法和属性,以便在 ToolStrip 中轻松访问。
使用 ToolStripControlHost 类来承载您的自定义控件或任何其他 Windows 窗体控件。
要自定义 ToolStripItem,请从 ToolStripControlHost 派生并创建自定义实现。您可以重写 OnSubscribeControlEvents 等方法来处理托管控件引发的事件,并且可以将自定义功能放入属性中以增强托管控件。
更新:根据ToolStripComboBox
文档,您可以ComboBox
通过ToolStripComboBox
'ComboBox
属性访问基础。
这就是为什么我通常在使用控件之前阅读它的文档。我可能不明白,但至少我会知道要寻找什么。:)
您应该像这样创建 Format 事件:
private void comboBox1_Format(object sender, ListControlConvertEventArgs e)
{
e.Value = GetFullIpFormat((string)e.Value);
}
这是格式化值的代码:
string GetFullIpFormat(string value)
{
string[] ip = new string[4];
for (int i = 0; i < ip.Length; i++)
{
ip[i] = GetIpPart(i, value);
}
return string.Format("{0:###}.{1:###}.{2:###}.{3:###}", ip[0], ip[1], ip[2], ip[3]);
}
string GetIpPart(int partNumber, string ip)
{
string result = "000";
int iLen = 3;
ip = ip.Replace(".", "");
int iStart = partNumber * iLen;
if (ip.Length > iStart)
{
result = ip.Substring(iStart);
if (result.Length > iLen)
{
result = result.Substring(0, iLen);
}
}
return result;
}
这将为您进行格式化。或者,您可以检查同一事件的输入是否有数字。这将为您完成工作,快乐编码!:)