4

NumericUpDown コントロールを設定して値をパーセンテージで表示するにはどうすればよいですか?

4

2 に答える 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 に答える