2017-09-03 4 views
0

Je tente de créer un contrôle personnalisé qui accepte les entrées en fonction de l'option sélectionnée. Je veux limiter le point décimal à un seul pour que l'utilisateur n'entrent pas plusieurs "." Comment puis-je faire ceci?C# Aide Création de contrôle personnalisé

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

exemple, je ne veux pas l'utilisateur d'entrer 12 ..... 123 je veux utilisateur d'entrer 12,123 et après un. il devrait désactiver le drapeau, mais quand je le fais, il ne me laissera pas entrer "." même après avoir enlevé le "."

Répondre

0

Plus facile que de définir des drapeaux, c'est de vérifier si votre TextBox contient déjà un "." avec la fonction intégrée. Donc, remplacez le code suivant:

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

avec:

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

De cette façon, vous pouvez également vérifier d'autres incohérences, comme vérifier si le texte dans la zone de texte commence par un « »

+0

Merci beaucoup, cela a fonctionné totalement :) J'ai besoin de ce drapeau parce que j'avais besoin d'une propriété pour régler le temps pour permettre des décimales ou non. – DeadlyTitan

0

Différentes cultures utilisent des séparateurs décimaux de nombres différents. Il est donc préférable de lire cette valeur à partir de CultureInfo.CurrentCulture.NumberFormat plutôt que de coder en dur une valeur. Comme vous héritez de TextBox, vous pouvez remplacer OnKeyPress au lieu de vous abonner à l'événement KeyPress. L'exemple suivant affiche également automatiquement 0. si le séparateur décimal est le premier caractère.

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