我只是想知道是否有人遇到过如何在C#中应用工具条组合框的输入掩码?
随着时间的推移,我的下拉框会被IP地址填充,我想限制用户能够写入的内容(Ex:只能输入3 '.'s,只有数字,等等)。
所以如果有人能帮忙的话,我会非常感激的!
提前谢谢。
编辑
我的设计已经改变了,所以我现在需要一个ToolStripComboBox
发布于 2012-09-18 16:45:22
您可以尝试捕获KeyUp事件,然后检查输入是否有效。如果不恢复到最后一个有效输入。您可能希望对验证事件执行类似的操作(确保CausesValidation为真)。
另一个选项是创建一个MaskedTextBox并将其放置起来,这样它就覆盖了下拉菜单的文本框部分。然后,您需要将事件连接起来,以便两个窗体控件保持同步。
您还可以查看ErrorProvider类。
还有其他几种方法(比如永远运行.3秒的计时器),但它们通常是性能的主宰,或者很难维护。
正则表达式注释更新
如果要这样做,我可能使用正则表达式,或者手动解析字符串。无论哪种方式,KeyUp和验证事件都是我检查控件验证的地方。KeyUp事件为我提供了在输入时检查的选项,而验证事件允许我在控件失去焦点时进行验证。您所使用的内容将取决于您希望用户体验的内容。
如果不使用KeyUp事件进行验证,则可以添加一个计时器,该计时器在上一个键按下5秒后运行。这样,控件就不必失去焦点才能显示错误。
更新已编辑的问题和注释
您不能使用Format事件,因为您的问题是如何格式化用户输入,而不是如何将内容添加到列表中。因此,该解决方案不适用于ToolStripComboBox或ComboBox。
在阅读了http://msdn.microsoft.com/en-us/library/system.windows.forms.toolstripcontrolhost.aspx的文档之后,您可能能够将http://msdn.microsoft.com/en-us/library/system.windows.forms.toolstripcombobox.aspx转换为http://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.aspx。如果没有,则可以使用http://msdn.microsoft.com/en-us/library/system.windows.forms.toolstripcontrolhost.aspx将http://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.aspx放置到表单上。-这是不正确或不必要的,请参阅下面的最新报价。
ToolStripControlHost是ToolStripComboBox、ToolStripTextBox和ToolStripProgressBar的抽象基类。ToolStripControlHost可以以两种方式承载其他控件,包括自定义控件:
使用ToolStripControlHost类承载自定义控件或任何其他Windows控件。
若要自定义ToolStripItem,请从ToolStripControlHost派生并创建自定义实现。您可以重写OnSubscribeControlEvents等方法来处理托管控件引发的事件,还可以将自定义功能放入属性中以增强托管控件。
Update:根据ToolStripComboBox文档,您可以通过ToolStripComboBox的ComboBox属性访问底层ComboBox。
这就是为什么我通常在使用控件之前先阅读控件上的文档。我可能不明白,但至少我会知道该找什么。:)
发布于 2012-09-18 17:04:38
您应该创建这样的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;
}这会为你安排好的。另外,您也可以检查同一事件的数字输入。这将为您完成这项工作,愉快的编码!:)
https://stackoverflow.com/questions/12481145
复制相似问题