2016-05-24 12 views
1

Ich versuche ein TextBox in einem C#/Windows Forms-Projekt einzurichten, so dass das Textfeld die Eingabesequenz formatiert, wenn der Benutzer einen Preis mithilfe der Tastatur oder des Nummernblocks eingibt sehe aus wie ein Preis.Reihenfolge der Tastenanschläge in einen Preis umwandeln

Beispiel: Benutzertypen 1-5-0 (abzüglich der Bindestriche), der Textwert des Textfelds ist $ 1,50.

Hier ist der Code, den ich versuche:

private string KeySequence; 

// ... 

private void TxtValue_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    if(char.IsDigit(e.KeyChar)) 
    { 
     KeySequence += e.KeyChar.ToString(); 

     if (KeySequence.Length > 0) 
     { 
      txtValue.Text = "$" + (decimal.Parse(KeySequence)/100).ToString("0.00"); 
     } 
    } 
} 

Das Problem ist, wenn ich in einem Wert eingeben, das erste Zeichen ist immer der letzte Schlüssel, die ich von der „$“ gefolgt, eingegeben und die Preis. Wenn ich 150 gebe, erscheint der formatierte Text als: 0$1.50.

Ich dachte, dies dem KeyDown Ereignis fällig ist, bevor KeyPress aufgerufen wird, so habe ich versucht, es für die mit dem Umgang mit Code zu unterdrücken:

private void TxtValue_KeyDown(object sender, KeyEventArgs e) 
{ 
    txtValue.Clear(); 
} 

Aber das ist immer noch nicht funktioniert.

Alles, was ich tun kann, um zu verhindern, dass der erste Charakter auftaucht?

+1

Um den Tastendruck abzubrechen, setzen Sie "e.Handled" auf "true" –

+0

Arbeitete wie ein Charme. Vielen Dank! –

Antwort

1

Nach dem Ereignis KeyPress wird der Tastendruck weiterhin vom Steuerelement verarbeitet.

Um dies zu verhindern, setzen Sie im Event-Handler e.Handled = true;.

0

Ich würde vorschlagen, ein benutzerdefiniertes Steuerelement zu erstellen, das von NumericUpDown erbt. Dann hätten Sie ein Steuerelement, das speziell für den Umgang mit Zahlen entwickelt wurde, automatisch Dezimalstellen und Tausendertrennzeichen behandelt, UP- und DOWN-Steuerelemente zum einfachen Inkrementieren bereitstellt und das entsprechende Währungssymbol anhängen/vorhängen kann.

Ich stehle den Formatierungsteil von this answer. Damit würde Ihre neue Klasse etwa wie folgt aussehen:

public class NumericUpDownCurrency : NumericUpDown 
{ 
    public NumericUpDownCurrency() 
    { 
     DecimalPlaces = 2; 
     Increment = 1; 
     ThousandsSeparator = true; 
    } 

    protected override void UpdateEditText() 
    { 
     ChangingText = true; 
     var decimalRegex = new Regex(@"(\d+([.,]\d{1,2})?)"); 
     var m = decimalRegex.Match(Text); 
     if (m.Success) 
      Text = m.Value; 
     ChangingText = false; 
     base.UpdateEditText(); 
     ChangingText = true; 
     Text = Value.ToString("C", CultureInfo.CurrentCulture); 
    } 
} 

Fügen Sie diese Klasse zu Ihrem Projekt hinzu und erstellen Sie sie. Sie sollten dann NumericUpDownCurrency in der Toolbox sehen, damit es auf einem Formular abgelegt werden kann. Die Kontrolle erledigt den Rest.

Verwandte Themen