忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

VB.NET:Spreadの数値セルタイプを使ってデータメンテナンスのプログラムに使う方法
マスタのメンテテンス用プログラムとしては、1個のウインドウでいろんな項目を入力するのですが、 基本的には項目名とそれに対応するデータ入力コントロールとしてテキストボックス等を設置します。
このテキストボックスには入力の書式や、キーデータの選択等を自分で組んでやる必要があります。 市販の入力用コントロールを使えばいいのですが、自分で組むと結構大変です。
そこで、SPREADの出番なのですが、SPREAD自身には既に入力コントロールが備わっています。 これを使わない手はありません。SPREADなので表形式になってしまいますが、 この形が許されるのであれば、SPREADを使っていいのではと思います。

SPREADには、数値セルタイプとして CurrencyCellType , NumberCellType がありますが、 今回は NumberCellType を使って数値用のメンテナンスを行う場合を想定した例を紹介します。

画面の表示は以下の様になります。

以下の今回のソースを示しますが、フォームのロード時に全ての数値セルの CellType を設定しています。 尚、最後のコード的なセルは、通常では編集入力後の表示で先頭ゼロを行う様に、  NumberCellType を拡張したクラスを定義しています。
また、セルの編集時には背景色と文字色を変更して入力を分かりやすくしています。

Imports FarPoint.Win.Spread.CellType
Public Class Form1
    'フォームロード時イベントで各数値セルの初期化
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim NumCell As New NumberCellType
        '【ZZ9】
        With NumCell
            .DecimalPlaces = 0
            .MaximumValue = 999
            .MinimumValue = 0
        End With
        FpSpread1.ActiveSheet.Cells(0, 1).CellType = NumCell

        '【ZZ9.99】
        NumCell = New NumberCellType
        With NumCell
            .DecimalPlaces = 2
            .MaximumValue = 999.99
            .MinimumValue = 0
        End With
        FpSpread1.ActiveSheet.Cells(1, 1).CellType = NumCell

        '【-ZZ9~ZZ9】
        NumCell = New NumberCellType
        With NumCell
            .DecimalPlaces = 0
            .MaximumValue = 999
            .MinimumValue = -999
            .NegativeRed = True
        End With
        FpSpread1.ActiveSheet.Cells(2, 1).CellType = NumCell

        '【-ZZ9.99~ZZ9.99】
        NumCell = New NumberCellType
        With NumCell
            .DecimalPlaces = 2
            .MaximumValue = 999.99
            .MinimumValue = -999.99
            .NegativeRed = True
        End With
        FpSpread1.ActiveSheet.Cells(3, 1).CellType = NumCell

        '【-ZZ,ZZ9~ZZ,ZZ9】
        NumCell = New NumberCellType
        With NumCell
            .DecimalPlaces = 0
            .MaximumValue = 99999
            .MinimumValue = -99999
            .NegativeRed = True
            .Separator = ","
            .ShowSeparator = True
        End With
        FpSpread1.ActiveSheet.Cells(4, 1).CellType = NumCell

        '【CODE 99999】
        Dim CdCell = New CodeCellType
        With CdCell
            .MaximumValue = 99999
            .MinimumValue = 0
        End With
        FpSpread1.ActiveSheet.Cells(5, 1).CellType = CdCell
    End Sub

    '編集中に背景色と文字色を変える
    Private Sub FpSpread1_EditModeOn(sender As Object, e As EventArgs) Handles FpSpread1.EditModeOn
        CType(FpSpread1.EditingControl, GeneralEditor).BackColor = Color.AntiqueWhite
        CType(FpSpread1.EditingControl, GeneralEditor).ForeColor = Color.Blue
    End Sub

    '入力データの取得・表示
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim str As String = ""
        str &= "ZZ9 : " & Me.FpSpread1.ActiveSheet.GetValue(0, 1) & vbCrLf
        str &= "ZZ9.99 : " & Me.FpSpread1.ActiveSheet.GetValue(1, 1) & vbCrLf
        str &= "-ZZ9~ZZ9 : " & Me.FpSpread1.ActiveSheet.GetValue(2, 1) & vbCrLf
        str &= "-ZZ9.99~ZZ9.99 : " & Me.FpSpread1.ActiveSheet.GetValue(3, 1) & vbCrLf
        str &= "-ZZ,ZZ9~ZZ,ZZ9 : " & Me.FpSpread1.ActiveSheet.GetValue(4, 1) & vbCrLf
        str &= "CODE 99999 : " & Me.FpSpread1.ActiveSheet.GetValue(5, 1) & vbCrLf
        MsgBox(str, "数値入力テスト")
    End Sub
End Class

'【CODE用カスタムセルクラス】
Public Class CodeCellType
    Inherits FarPoint.Win.Spread.CellType.NumberCellType

    Public Sub New()
        MyBase.New()
        Me.DecimalPlaces = 0
    End Sub

    '編集を抜ける時に先頭ゼロ付きで表示
    Public Overrides Function Format(ByVal obj As Object) As String
        Dim Val As Decimal = Convert.ToDecimal(obj)
        Dim Len As Integer = Me.MaximumValue.ToString.Length
        Return Val.ToString(New String("0"c, Len))
    End Function
End Class

下図は、「Button1」をクリックした時の表示です。


■SPREADをコントロールを何個も設置

SPREADの表形式が気に入らないのであれば、テキストボックスを何個も設置する様に 1セルしかないSPREADを個別に設置し、それぞれのSPREADのセルにCellTypeを設定してやれば テキストボックス的に使えます。
この方法だと、SPREADコントロールを何個も設置するのでプログラムの動きが重くなるかも しれませんが、意外と使える方法だと思いますが、如何でしょうか?


=====
2016/03/18:の時の情報











PR

コメント

コメントを書く