0

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

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

因此,如果有人能够提供帮助,我将不胜感激!

提前致谢。

编辑

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

4

2 回答 2

1

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

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

您还可以查看ErrorProvider类。

还有其他几种方法(例如每 0.3 秒运行一次的计时器),但这些方法通常会消耗性能或难以维护。

正则表达式注释更新
如果我要这样做,我可能会使用正则表达式,或者我可能会手动解析字符串。无论哪种方式,KeyUp 和 Validating 事件都是我检查控件验证的地方。KeyUp 事件让我可以选择在输入时进行检查,而 Validating 事件让我可以验证控件何时失去焦点。您使用哪种取决于您想要的用户体验。

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

已编辑问题和评论的更新
您不能使用Format事件,因为您的问题是关于如何格式化用户输入,而不是如何将内容添加到列表中。因此,该解决方案不适ToolStripComboBox用于ComboBox.

阅读文档后ToolStripControlHost,您也许可以转换ToolStripComboBoxComboBox. 如果没有,那么您可以使用 将ToolStripControlHost放置ComboBox到您的表单上。 - 这是不正确或不必要的,请参阅报价下方的更新。

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

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

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

使用 ToolStripControlHost 类来承载您的自定义控件或任何其他 Windows 窗体控件。

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

更新:根据ToolStripComboBox文档,您可以ComboBox通过ToolStripComboBox'ComboBox属性访问基础。

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

于 2012-09-18T16:45:22.067 回答
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;
    }

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

于 2012-09-18T17:04:38.980 回答