2010-12-03 24 views
0

Ich möchte diese WinForm Kontrolle machen (NumericUpDown) erzwingen ganze Zahlen bedingt je nach Typ (ganz vs floating) der Sache, mit der ich arbeite.Wie kann verhindert werden, dass System.Windows.Forms.NumericUpDown nicht-Ziffern eingibt, wenn DecimalPlaces = 0 ist?

Wenn ich die DecimalPlaces = 0 einstelle, wird 0 angezeigt, und dann wird diese um 1 erhöht/verringert, wenn ich auf/ab klicke. Wenn ich jedoch 0.6 eingeben, wird es als 1 angezeigt, bleibt aber als 0.6. Wenn ich es anschließend inkrementiere, wird der zugrunde liegende aber nicht angezeigte Wert 1,6 sein.

Ich bin auf der Suche nach einer einfachen, idiomatischen Art und Weise zu erzwingen, was ich will (hoffentlich ist klar, was ich will). Wenn ich irgendeine Art von Ereignis abfangen muss, werde ich das tun, aber ich hoffe, dass ich mich nur auf einige Flags/Einstellungen verlassen kann, die die Klasse NumericUpDown bereits bietet.

Wenn Ihre Lösung Sub-Classing NumericUpDown umfasst, dann muss ich darüber nachdenken. In diesem Stadium der Veröffentlichung würde ich einen gut dokumentierten Hack einer sauberen Änderung vorziehen, die an anderer Stelle Fehler verursachen könnte. Ich hätte gerne die Möglichkeit, die NumericUpDown nicht zu unterteilen.

Lassen Sie mich wissen, wenn Sie Fragen haben, danke.

Antwort

1

Der zugrunde liegende Wert ist vom Typ Dezimal. Die Dezimalstellen wirken sich nur auf die Anzahl der im Steuerelement angezeigten Ziffern aus. Der einfachste Weg, um das zu erreichen, was Sie wollen, ist, den NumericUpDown.Value auf einen int zu runden.

+0

Andrei, könnten Sie genauer auf WIE das tun? Genauer - welches Ereignis sollte ich abfangen? Ich möchte nicht, dass Benutzer überhaupt denken, dass sie nicht ganzzahlige Werte eingeben können. Ich * könnte * den Wert runden, aber ich möchte auch nicht, dass sie 0,7 eingeben können - ich möchte, dass die Validierung fehlschlägt. –

+0

Sie sollten den Wert überall dort runden, wo Sie ihn verwenden. Oder wenn Sie ein Ereignis abfangen (und einen kleinen Hack hinzufügen möchten), können Sie das ValueChanged-Ereignis abfangen und hier den Wert auf den Runden-Teil ändern (nur wenn es nicht bereits gerundet ist - um eine Endlosschleife zu vermeiden!) –

+0

Hm ... ist es besser als das TextChanged-Ereignis zu hacken? Ich möchte den Wert nicht stillschweigend korrigieren - ich möchte, dass der Benutzer irgendwie weiß, dass seine Eingabe nicht akzeptiert wird. –

0

Hier ist eine unvollkommene Lösung, die wir verwenden. Erstens verhindern, dass der Benutzer eine Dezimalzahl eingeben (alles andere der Benutzer eingeben könnten scheint durch die Steuerung selbst ganz gut behandelt werden):

Private Sub HandleKeyPress(sender As Object, e As Windows.Forms.KeyPressEventArgs) Handles MyNumericUpDown.KeyPress 
    If e.KeyChar = "."c Then e.Handled = True 
End Sub 

Zweitens von dem Benutzer verhindern etwas anderes als Ziffern einfügen. Beachten Sie, dass der Ansatz, den ich gewählt habe, eine Reihe spezifischer Tastenkombinationen fest codiert (Strg-V und Shift-Einfügung). Andere Möglichkeiten, die der Benutzer einfügen kann, werden nicht behandelt, z. B. über das Kontextmenü des Up-Down-Steuerelements.

Dies ist nicht die perfekte Lösung, aber es ist nahe genug an dem beabsichtigten Verhalten für unsere Bedürfnisse.