【问题标题】:Apply Input Mask for a ToolStripComboBox C#为 ToolStripComboBox C# 应用输入掩码
【发布时间】:2012-09-20 07:26:22
【问题描述】:

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

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

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

提前致谢。

编辑

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

【问题讨论】:

  • 也许我可以应用正则表达式?但是我该怎么做呢?
  • ToolStipComboBox 和 ComboBox 之间不应该有任何区别,非常小。下面的两种解决方案在这两个选项之间应该是一样的。
  • @Trisped 这不是真的,因为 ToolStripComboBox 没有继承 ListControl,据我了解,ListControl 了解格式化。
  • 我在下面更新了我的答案来解决这个问题。

标签: c# validation user-input mask


【解决方案1】:

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

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

您还可以查看ErrorProvider 类。

还有其他几种方法(例如每 0.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 等方法来处理托管控件引发的事件,并且可以将自定义功能放入属性中以增强托管控件。

更新: 根据ToolStripComboBox 文档,您可以通过ToolStripComboBoxComboBox 属性访问底层ComboBox

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

【讨论】:

    【解决方案2】:

    你应该像这样创建 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;
        }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-21
      • 2020-08-15
      • 2019-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多