为ToolStripComboBox应用输入掩码C#

时间:2012-09-18 16:26:18

标签: c# validation user-input mask

我只是想知道是否有人遇到如何在C#中为工具条组合框应用输入掩码?

我的下拉框会随着时间的推移填充IP地址,我想限制用户可以写入的内容(例如:只能输入3'。只有数字等)。

所以,如果有人能够提供帮助,我会非常感激!

提前致谢。

修改

我的设计已经改变,所以我现在需要一个ToolStripComboBox

2 个答案:

答案 0 :(得分:1)

您可以尝试捕获KeyUp event,然后检查输入是否有效。如果不将其还原为最后一个有效输入。您可能希望对Validating事件执行类似操作(确保CausesValidation为真)。

另一种选择是创建MaskedTextBox并将其放置,使其覆盖下拉菜单的文本框部分。然后,您需要连接事件,以便两个表单控件保持同步。

您还可以查看ErrorProvider课程。

还有其他几种方式(比如计时器运行时间为.3秒),但这些方式通常都是性能损失或难以维护。

正则表达式评论更新
如果我这样做,我可能会使用正则表达式,或者我可能会手动解析字符串。 无论哪种方式,KeyUp和Validating事件都是我检查控件验证的地方。 KeyUp事件为我提供了在键入时检查的选项,而Validating事件允许我验证控件何时失去焦点。您使用的将取决于您希望用户体验的内容。

如果您不使用KeyUp事件进行验证,则可以添加一个在最后一次按键后5秒运行的计时器。这样,控件就不必失去焦点以显示错误。

已修改的问题和评论的更新
您无法使用Format事件,因为您的问题是如何格式化用户输入,而不是如何将内容添加到列表中。因此,该解决方案不适用于ToolStripComboBoxComboBox

阅读ToolStripControlHost的文档后,您可以将ToolStripComboBox投射到ComboBox。如果没有,那么您可以使用ToolStripControlHostComboBox放在表单上。 - 这是不正确或不必要的,请参阅引号下方的更新。

  

ToolStripControlHost是ToolStripComboBox,ToolStripTextBox和ToolStripProgressBar的抽象基类。 ToolStripControlHost可以通过两种方式托管其他控件,包括自定义控件:

     
      
  • 使用派生自Control的类构造ToolStripControlHost。要完全访问托管控件和属性,必须将Control属性强制转换回它所代表的实际类。

  •   
  • 扩展ToolStripControlHost,并在继承类的默认构造函数中,调用基类构造函数,传递从Control派生的类。此选项允许您包装常用控件方法和属性,以便在ToolStrip中轻松访问。

  •   
     

使用ToolStripControlHost类来托管自定义控件或任何其他Windows窗体控件。

     

要自定义ToolStripItem,请从ToolStripControlHost派生并创建自定义实现。您可以覆盖OnSubscribeControlEvents等方法来处理托管控件引发的事件,并且可以将自定义功能放入属性中以增强托管控件。

<强>更新: 根据{{​​3}}文档,您可以访问基础ToolStripComboBoxComboBoxToolStripComboBox属性。

这就是为什么我在使用它之前通常会阅读控件上的文档。我可能不明白,但至少我会知道要寻找什么。 :)

答案 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;
    }

这将为您完成格式化。 或者,您可以检查相同事件的输入数字。 这将为您完成工作,快乐编码! :)