我只是想知道是否有人遇到如何在C#中为工具条组合框应用输入掩码?
我的下拉框会随着时间的推移填充IP地址,我想限制用户可以写入的内容(例如:只能输入3'。只有数字等)。
所以,如果有人能够提供帮助,我会非常感激!
提前致谢。
修改
我的设计已经改变,所以我现在需要一个ToolStripComboBox
答案 0 :(得分:1)
您可以尝试捕获KeyUp event,然后检查输入是否有效。如果不将其还原为最后一个有效输入。您可能希望对Validating事件执行类似操作(确保CausesValidation为真)。
另一种选择是创建MaskedTextBox并将其放置,使其覆盖下拉菜单的文本框部分。然后,您需要连接事件,以便两个表单控件保持同步。
您还可以查看ErrorProvider课程。
还有其他几种方式(比如计时器运行时间为.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等方法来处理托管控件引发的事件,并且可以将自定义功能放入属性中以增强托管控件。
<强>更新强>:
根据{{3}}文档,您可以访问基础ToolStripComboBox
到ComboBox
的ToolStripComboBox
属性。
这就是为什么我在使用它之前通常会阅读控件上的文档。我可能不明白,但至少我会知道要寻找什么。 :)
答案 1 :(得分:1)
您应该像这样创建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;
}
这将为您完成格式化。 或者,您可以检查相同事件的输入数字。 这将为您完成工作,快乐编码! :)