【问题标题】:WinForms - MaskedTextBox - "variable-width" masking possible?WinForms - MaskedTextBox - “可变宽度”屏蔽可能吗?
【发布时间】:2010-01-22 16:36:27
【问题描述】:

我需要创建一个允许十进制文本或整数文本的 WinForms 文本框。另外,我不希望被要求指定掩码中文本的长度;用户应该能够输入任意数量的字符,只要文本符合十进制或整数模式即可。但是,据我所知,MaskedTextBox 不允许变长屏蔽;我也找不到执行此操作的预先存在的控件。

建议?我想我可以继承 TextBox,覆盖 OnKeyPress 并在那里完成工作,但我不知道预先存在的控件是否会更优雅地做事。

【问题讨论】:

    标签: c# textbox winforms


    【解决方案1】:

    NumericUpDown 控件具有一些内置的十进制/整数解析行为 - 听起来可能就是您要查找的内容。当然,您最终也会在文本框上使用 updown 控件。

    【讨论】:

    • 我看了一下那个控件。有一种方法可以隐藏微调器(向上/向下按钮),但它看起来不是很干净。 NumericUpDown nud; ... nud.Controls[0].Hide();
    【解决方案2】:

    试试这个:

    private void TextBox1_Validating(object sender, EventArgs e)
    {
        string expression = "^\d{1,8}(\.\d{2,2})?$";
        if (System.Text.RegularExpressions.Regex.Match(this.txt_monto_total.Text, expression).Success)
            this.label_total.Visible = false;
        else
            this.label_total.Visible = true;
    }
    

    它不是一个掩码,但它会让你告诉用户他们是否输入了错误的格式(我通过显示标签来做到这一点),你可以使用任何正则表达式,在我的例子中,我只想要 1 或 8 的数字“.”前的数字和 2 之后。

    【讨论】:

      【解决方案3】:

      这里有一个解决方案。它并不完美 - 在某些情况下它可能会吃掉控制字符,并且它不能干净地处理粘贴 - 但它工作得很好!

      using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.Drawing;
      using System.Data;
      using System.Text;
      using System.Windows.Forms;
      
      namespace WinFormsTest
      {
          public partial class MaskedTextBox : TextBox
          {
              public enum EntryTypeEnum
              {
                  Any,
                  Integer,
                  Decimal
              }
      
              [DefaultValue(EntryTypeEnum.Any)]
              public EntryTypeEnum EntryType { get; set; }
      
              public MaskedTextBox()
              {
                  InitializeComponent();
              }
      
              protected override void OnKeyPress(KeyPressEventArgs e)
              {
                  var keyIsValid =
                      (EntryType == EntryTypeEnum.Any)
                      || char.IsControl(e.KeyChar)
                      || isValid(Text + e.KeyChar);
                  e.Handled = !keyIsValid;
                  base.OnKeyPress(e);
              }
      
              protected override void OnValidating(CancelEventArgs e)
              {
                  e.Cancel = !isValid(Text);
                  base.OnValidating(e);
              }
      
              protected bool isValid(string textToValidate)
              {
                  switch (EntryType)
                  {
                      case EntryTypeEnum.Any:
                          break;
      
                      case EntryTypeEnum.Decimal:
                          {
                              decimal result;
                              if (!decimal.TryParse(textToValidate, out result))
                              {
                                  return false;
                              }
                          }
                          break;
      
                      case EntryTypeEnum.Integer:
                          {
                              int result;
                              if (!int.TryParse(textToValidate, out result))
                              {
                                  return false;
                              }
                          }
                          break;
                  }
      
                  return true;
              }
          }
      }
      

      【讨论】:

        【解决方案4】:

        经过大量搜索,我能够在 codeproject 上发现一个允许可变长度数字的控件。

        这是Nullable Masked Edit, and a Better Masked Edit Also! 项目。

        请注意,您需要使用“EditMask”字段来设置 Mask 属性。尝试设置“掩码”字段将不起作用。

        我能够设置掩码 999.9,然后输入 1.1 即可,无需添加前导空格。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-07
          • 1970-01-01
          • 2013-02-19
          • 2019-05-19
          • 2018-01-04
          • 1970-01-01
          • 1970-01-01
          • 2011-06-14
          相关资源
          最近更新 更多