2010-01-22 35 views
3

我需要創建一個WinForms文本框,它允許十進制文本的獨佔或整數文本。另外,我不希望被要求指定掩碼中文本的長度;只要文本符合十進制或整數模型,用戶應該能夠輸入儘可能多的字符。然而,就我所知,MaskedTextBox不允許可變長度掩碼;我無法找到預先存在的控制器。WinForms - MaskedTextBox - 「可變寬度」屏蔽可能嗎?

建議?我想我可以繼承TextBox,重寫OnKeyPress並在那裏完成工作,但我不知道預先存在的控件是否會更優雅地執行操作。

回答

1

NumericUpDown控件有一些內置的十進制/整數解析行爲 - 聽起來像它可能是你要找的東西。當然,你最終也會在文本框中使用updown控件。

+1

我看了一下那個控件。有一種方法可以隱藏旋鈕(上/下按鈕),但它看起來不太乾淨。 NumericUpDown nud; ... nud.Controls [0] .Hide(); – lolwhat 2010-01-22 20:56:12

0

這是一個解決方案。這並不完美 - 它可能會在某些情況下吃控制角色,並且不會乾淨地處理粘貼 - 但它運行得足夠好!

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; 
     } 
    } 
} 
1

試試這個:

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個。

0

經過多次搜索,我能夠發現一個控制代碼項目,允許一個可變長度的數字。

這是Nullable Masked Edit, and a Better Masked Edit Also!項目。

請注意,您需要使用'EditMask'字段來設置Mask屬性。嘗試設置「蒙版」字段將不起作用。

我能夠設置999.9的掩碼,然後輸入1.1將無需添加前導空格即可工作。