Ich habe ein hexadezimales NumericUpDown-Steuerelement erstellt, indem ich das grundlegende NumericUpDown-Objekt untergeordnet und die folgende Methode hinzugefügt habe:
%Vor%Das funktioniert ziemlich gut. Das Steuerelement zeigt nun Werte im folgenden Format an:
0x3F
was genau ich suchte.
Aber eine Sache stört mich: Jedes Mal, wenn die Text -Eigenschaft zugewiesen wird, wird eine System.FormatException ausgelöst. Das scheint die Funktionalität des Steuerelements nicht zu beeinträchtigen, aber ich denke, es ist hässlich.
Dies ist der Anfang des Callstacks:
MyAssembly.dll! HexNumericUpDown.UpdateEditText () Zeile 31 C # System.Windows.Forms.dll! System.Windows.Forms.NumericUpDown.ValidateEditText () Unbekannt System.Windows.Forms.dll! System.Windows.Forms.UpDownBase.Text.set (Zeichenfolgenwert) Unbekannt
Kann ich diese Ausnahme einfach ignorieren? Oder gibt es einen sauberen Weg, um das los zu werden?
Sie müssen die ValidateEditText () -Methode überschreiben, damit Sie das (optionale) Präfix "0x" richtig behandeln können. Überschreiben Sie UpdateEditText () mit dem Präfix "0x". Fügen Sie Ihrem Projekt eine neue Klasse hinzu und fügen Sie den unten gezeigten Code ein. Kompilieren. Legen Sie das neue Steuerelement oben in der Toolbox auf Ihr Formular:
%Vor%Fwiw, der skurrile Versuch / catch-em-all kommt direkt aus der .NET-Version. Ich behielt es, damit sich die Steuerung auf die gleiche Weise verhält. Tweak das ToString () - Argument, wie Sie es wollen.
Ich denke, Sie müssen auch ParseEditText <überschreiben / a> ValidateEditText Methode, um zu akzeptieren Der Hex-Wert und setzen Sie die Value-Eigenschaft auf den richtigen Wert int.
Es gibt einen Unterschied zwischen Casting und ConvertTo:
(int)obj
- dies ist eine explizite Umwandlung von obj in den Typ int. Sie sagen dem Compiler, dass obj ein int ist. Wenn obj kein int-Typ ist, erhalten Sie eine Cast-Ausnahme. Aber es ist nicht WIRKLICH ein Int. und das X2-Format benötigt echte Ints.
Convert.ToInt32(obj)
- Dies ist ein expliziter Aufruf der Convert-Klasse, um eine int-Repräsentation von obj zurückzugeben.
Aus diesem Grund müssen Sie Convert.ToInt32(Value)
ABER In MSDN heißt es:
1) Diese API (numericUpDown.Text) unterstützt das .NET Framework Infrastruktur und soll nicht direkt von Ihrem Code verwendet werden.
2) Der Text hat keine Auswirkungen auf die Darstellung von NumericUpDown Steuerung; daher ist es im Designer und aus dem versteckt IntelliSense.