NumericUpDown コントロールを設定して値をパーセンテージで表示するにはどうすればよいですか?
3785 次
2 に答える
5
UpdateEditText()
独自のカスタム コントロールを派生させ、メソッドをオーバーライドする必要があります。Minimum
途中で、デフォルトの 、Maximum
、およびIncrement
プロパティ値をオーバーライドして、パーセンテージをもう少し使いやすくしましょう。
また、基本メソッドをオーバーライドしてParseEditText()
、ユーザーが生成した入力をパーセンテージ (100 で割る) として解釈する必要があります。これは、ユーザーが入力80
して表すことを期待するためです80%
(そして、Decimal パーサーはパーセンテージ記号を無視する必要があります)。
Public Class PercentUpDown
Inherits NumericUpDown
Private Shared ReadOnly DefaultValue As New [Decimal](0.0) ' 0%
Private Shared ReadOnly DefaultMinimum As New [Decimal](0.0) ' 0%
Private Shared ReadOnly DefaultMaximum As New [Decimal](1.0) ' 100%
Private Shared ReadOnly DefaultIncrement As New [Decimal](0.01) ' 1%
Public Sub New()
Value = DefaultValue
Minimum = DefaultMinimum
Maximum = DefaultMaximum
Increment = DefaultIncrement
End Sub
Protected Overrides Sub UpdateEditText()
If UserEdit Then
ParseEditText()
End If
Text = Value.ToString(String.Format("p{0}", DecimalPlaces))
End Sub
Protected Shadows Sub ParseEditText()
Debug.Assert(UserEdit = True, "ParseEditText() - UserEdit == false")
Try
If Not String.IsNullOrWhiteSpace(Text) AndAlso _
Not (Text.Length = 1 AndAlso Text.Equals("-")) Then
Value = Constrain(Decimal.Parse(Text.Replace("%", String.Empty), NumberStyles.Any, CultureInfo.CurrentCulture) / 100)
End If
Catch ex As Exception
' Leave value as it is
Finally
UserEdit = False
End Try
End Sub
Private Function Constrain(origValue As [Decimal]) As [Decimal]
Debug.Assert(Minimum <= Maximum, "minimum > maximum")
If origValue < Minimum Then Return Minimum
If origValue > Maximum Then Return Maximum
Return origValue
End Function
End Class
設計時に使用したい数値表示形式TextFormat
を設定できるプロパティを追加することで、クラスの範囲を少し拡張できます。これにより、たとえば、値を通貨として表示できるようになります。
ただし、上記のコードは素晴らしくコンパクトで、特にパーセンテージを対象としており、既存のDecimalPlaces
プロパティを利用しています。プロパティはパーセンテージのValue
数学的表現 (たとえば、50% の場合は 0.5) として保存されるため、100 で割ることを気にせずに簡単に数式に組み込むことができます。
于 2013-02-06T06:05:37.073 に答える