TextBoxコントロールを継承し、特定のフォーマットを作成したい

タグの編集
投稿者 ケンケン  (社会人) 投稿日時 2024/11/15 14:06:47
整数・小数部の最大桁数を網羅に、
Format(#,##0.00)を定義出来るようにしたい

投稿者 ケンケン  (社会人) 投稿日時 2024/11/15 14:08:44
追伸
 最大桁数 内部で管理します。
 例
  整数部が5桁、小数部が3桁です。

 
投稿者 (削除されました)  () 投稿日時 2024/11/15 16:49:18
(削除されました)
投稿者 (削除されました)  () 投稿日時 2024/11/15 16:53:43
(削除されました)
投稿者 KOZ  (社会人) 投稿日時 2024/11/15 17:01:46
作業依頼ですか?いくらで作業しましょうか?

冗談はさておき
https://gist.github.com/KOZ60/48ba34bd6e0f0e66814e82ec833b2eb7

を継承して以下のようにしてみてください
フォーカスが離れたら、FormatString に指定した書式で整形されます。

Imports System.ComponentModel

Public Class NumberText
    Inherits RestrictText

    Public Property FormatString As String = "#,0.000"
    Public Property IntegerLength As Integer = 5 '整数部の桁数 
    Public Property DecimalLength As Integer = 3 '小数部の桁数 

    Private Shared ReadOnly allowChars As New HashSet(Of Char)("0123456789.-".ToArray())

    Protected Overrides Function IsAllowChar(inputChar As CharAs Boolean
        Return allowChars.Contains(inputChar)
    End Function

    Protected Overrides Function IsValidText(reflectsText As StringAs Boolean
        If String.IsNullOrEmpty(reflectsText) Then
            Return True
        End If
        Dim dec As Decimal
        If Not Decimal.TryParse(reflectsText, dec) Then
            Return False
        End If
        reflectsText = reflectsText.Replace("-""")
        Dim pos As Integer = reflectsText.IndexOf(".")
        Dim ilen As Integer
        Dim dlen As Integer
        If pos = -1 Then
            ilen = reflectsText.Length
            dlen = 0
        Else
            ilen = pos
            dlen = reflectsText.Length - pos - 1
        End If
        If ilen > IntegerLength OrElse dlen > DecimalLength Then
            Return False
        End If
        Return MyBase.IsValidText(reflectsText)
    End Function

    Protected Overrides Function Format(value As StringAs String
        Dim dec As Decimal
        If Decimal.TryParse(value, dec) Then
            Return dec.ToString(FormatString)
        Else
            Return value
        End If
    End Function

    <Browsable(False)>
    <DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)>
    Public Property Value As Decimal
        Get
            Dim dec As Decimal
            If Decimal.TryParse(Text, dec) Then
                Return dec
            Else
                Return 0
            End If
        End Get
        Set(value As Decimal)
            Text = value.ToString(FormatString)
        End Set
    End Property

End Class


もっと凝った仕様が欲しいのであれば、メシウスの InputMan を使ったらどうでしょう?
https://developer.mescius.jp/inputmanplus-winforms
投稿者 ケンケン  (社会人) 投稿日時 2024/11/18 09:28:53
回答ありがとうございます。

旧名:グレップシティーはライセンス料金が高すぎますね。

  多段明細は、MultiRowが便利ですよね。
投稿者 ケンケン  (社会人) 投稿日時 2024/11/18 10:26:35
解決チェック忘れ