2008-10-28 8 views
3

Je fais une application Winforms financière et j'ai quelques problèmes avec les contrôles.Zone de texte décimal dans Windows Forms

Mon client doit insérer des valeurs décimales un peu partout (prix, rabais, etc.) et je souhaite éviter certaines validations répétées.

J'ai donc immédiatement essayé le MaskedTextBox qui correspondrait à mes besoins (avec un masque comme "00000.00"), s'il n'y avait pas le focus et la longueur du masque.

Je ne peux pas prédire la taille des numéros que mon client va entrer dans l'application.

Je ne peux pas m'attendre à ce qu'il commence tout avec 00 pour arriver à la virgule. Tout devrait être adapté au clavier. Ai-je manqué quelque chose ou est-ce qu'il n'y a simplement aucun moyen (au-delà de l'écriture d'un contrôle personnalisé) d'atteindre cet objectif avec les contrôles Windows Forms standard?

Répondre

5

Ces deux méthodes outrepassée l'ont fait pour moi (disclaimer: ce code n'est pas en production mais vous devrez peut-être modifier.)

protected override void OnKeyPress(KeyPressEventArgs e) 
    { 
     if (!char.IsNumber(e.KeyChar) & (Keys)e.KeyChar != Keys.Back 
      & e.KeyChar != '.') 
     { 
      e.Handled = true; 
     } 

     base.OnKeyPress(e); 
    } 

    private string currentText; 

    protected override void OnTextChanged(EventArgs e) 
    { 
     if (this.Text.Length > 0) 
     { 
      float result; 
      bool isNumeric = float.TryParse(this.Text, out result); 

      if (isNumeric) 
      { 
       currentText = this.Text; 
      } 
      else 
      { 
       this.Text = currentText; 
       this.Select(this.Text.Length, 0); 
      } 
     } 
     base.OnTextChanged(e); 
    } 
+0

Merci beaucoup. J'ai implémenté ceci avec un contrôle personnalisé et j'ai aussi blogué à ce sujet: http://www.tigraine.at/2008/10/28/decimaltextbox-for-windows-forms/ – Tigraine

5

Vous aurez besoin d'un contrôle personnalisé. Il suffit de piéger l'événement Validating sur le contrôle et de vérifier si l'entrée de chaîne peut être analysée en tant que décimale.

+0

Merci .. qui me laisse le prochain défi .. créer un contrôle personnalisé * gg * .. – Tigraine

3

Je ne pense pas que vous avez besoin d'un contrôle personnalisé, il suffit d'écrire une méthode validation décimale pour l'événement de validation et de l'utiliser pour tous les endroits dont vous avez besoin pour valider. Ne pas oublier d'inclure le NumberFormatInfo, il va traiter avec des virgules et des signes numebr.

+0

Avoir un contrôle personnalisé prêt à lui sauver un tas de code passe-partout partout où il doit accrocher cette place : c'est une bonne chose à faire. –

0

Vous avez seulement besoin de laisser des chiffres et des symboles décimaux à travers, et éviter double symbole décimal. En plus, ceci ajoute automatiquement un 0 avant un nombre décimal de départ.

public class DecimalBox : TextBox 
{ 
    protected override void OnKeyPress(KeyPressEventArgs e) 
    { 
     if (e.KeyChar == ',') 
     { 
      e.KeyChar = '.'; 
     } 

     if (!char.IsNumber(e.KeyChar) && (Keys)e.KeyChar != Keys.Back && e.KeyChar != '.') 
     { 
      e.Handled = true; 
     } 

     if(e.KeyChar == '.') 
     { 
      if (this.Text.Length == 0) 
      { 
       this.Text = "0."; 
       this.SelectionStart = 2; 
       e.Handled = true; 
      } 
      else if (this.Text.Contains(".")) 
      { 
       e.Handled = true; 
      } 
     } 

     base.OnKeyPress(e); 
    } 
} 
Questions connexes