2017-09-03 144 views
0

我試圖製作一個自定義控件,它接受輸入取決於所選的選項。我想限制小數點只有一個,所以用戶不會輸入多個「。」。我怎樣才能做到這一點?C#幫助創建自定義控件

using System; 
using System.Windows.Forms; 
using System.ComponentModel; 

namespace DT_Controls 
{ 
    public enum Options { Any, Alphabets, Alpha_Numeric, Numeric } 

    public class TextBox_Pro : TextBox 
    { 
     Options _Opt = 0; 
     bool _Flag = false; 
     int Count = 0; 

     [Category("Behavior")] 
     [Description("If set as true will accept decimal values when SetOption is Numeric")] 
     public bool AcceptDecimal 
     { 
      get { return _Flag; } 
      set { _Flag = value; } 
     } 

     [Category("Behavior")] 
     [Description("Controls the type of value being entered into the TextBox_Pro")] 
     public Options SetOption 
     { 
      get { return _Opt; } 
      set { _Opt = value; } 
     } 

     public TextBox_Pro() 
     { 
      this.KeyPress += TextBox_Pro_KeyPress; 
     } 

     private void TextBox_Pro_KeyPress(object sender, KeyPressEventArgs e) 
     { 
      if (Convert.ToInt32(e.KeyChar) == 8) 
       return; 
      switch (_Opt) 
      { 
       case Options.Numeric: 
        if (_Flag == true) 
         if (Convert.ToInt32(e.KeyChar) == 46) 
          return; 
        if (char.IsDigit(e.KeyChar) == false) 
        { 
         MessageBox.Show("Enter Numeric Values Only"); 
         e.Handled = true; 
        } 
        break; 
       case Options.Alphabets: 
        if(char.IsLetter(e.KeyChar)==false && Convert.ToInt32(e.KeyChar) != 32) 
        { 
         MessageBox.Show("Enter Only Aplhabets"); 
         e.Handled = true; 
        } 
        break; 
       case Options.Alpha_Numeric: 
        if (char.IsLetterOrDigit(e.KeyChar) == false) 
        { 
         MessageBox.Show("Enter Only Alphabets Or Numbers"); 
         e.Handled = true; 
        } 
        break; 
      } 
     } 
    } 
} 

例如,我不想讓用戶輸入12 ..... 123我希望用戶輸入12.123和之後。它應該禁用該標誌,但是當我這樣做,它不會讓我允許輸入任何「。」即使在刪除「。」之後。

回答

0

不是設置任何標誌,更容易被檢查,如果你的文本框已經包含任何「」具有內置功能。因此,將以下代碼:

if (_Flag == true) 
    if (Convert.ToInt32(e.KeyChar) == 46) 
     return; 

有:

if (Convert.ToInt32(e.KeyChar) == 46) 
    { 
     if (this.Text.Contains(".")) 
      { 
       e.Handled = true; 
      } 
      return; 
    } 

這種方式,你也可以檢查其他的不一致,如檢查,如果在文本框中的文本的開頭有「」

+0

非常感謝你,那完全工作:)我需要那個標誌,因爲我需要一個屬性被設置天氣允許小數或不。 – DeadlyTitan

0

不同文化使用不同數量的小數點分隔符,所以這是最好的閱讀從CultureInfo.CurrentCulture.NumberFormat,而不是硬編碼的值。由於您從TextBox繼承,因此您可以覆蓋OnKeyPress而不是訂閱KeyPress事件。如果小數點分隔符是第一個字符,則以下示例也自動顯示0.

[ToolboxBitmap(typeof(TextBox))] 
public class TextBoxPro 
    : TextBox 
{ 
    static NumberFormatInfo  s_numberFormatInfo = CultureInfo.CurrentCulture.NumberFormat; 

    public static readonly string s_decimalSeparator = s_numberFormatInfo.NumberDecimalSeparator; 

    protected override void OnKeyPress(KeyPressEventArgs e) 
    { 
     base.OnKeyPress(e); 

     if (ReadOnly) 
      return; 

     var keyChar = e.KeyChar; 
     var keyString = keyChar.ToString(); 

     if (keyString == s_decimalSeparator) 
     { 
      if (IsAllSelected) 
      { 
       e.Handled  = true; 
       Text   = "0."; 
       SelectionStart = 2; 
      } 
      else if (Text.Contains(s_decimalSeparator)) 
       e.Handled = true; 
     } 
    } 

    private bool IsAllSelected 
    { 
     get { return SelectionLength == TextLength; } 
    } 
}