忍者ブログ

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

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

Nullableな変数の使い方(GrapeCityのInputManのコントロールに関連して)

データ入力を行うフォームを作成する時に、システム標準のTextBox等でできればいいのですが、 より細かな入力制限などを行いたい場合に市販されているコントロールを利用するのも手だと思います。

GrapeCity かたはいろんなコントロールが販売されていて、フォーム上の入力を楽にするものの一つとして InputMan があります。 InputMan には日付、文字列、数値、コンボボックスなどの拡張入力コントロールが揃っています。 一からコントロールを作成するよりは買った方が早いのでこれを使用しています。 (私は特に GrapeCity の回し者でもありませんが)

InputManのコントロールですが、一つ気をつけないといけない点があります。
例として数値入力のコントロールである GcNumber を取り上げてみます。 GcNumber は数値入力ですので、値を設定・取得する場合のプロパティとして Value が利用します。 この Value のデータ型がNULLを許すNullable型のDecimalとして定義されています。

この例を示すために、 フォーム上に GcNumber を1個と、ボタンを2個貼り付けます。

GcNumberValue について

Public Class frmDataNullable

    'フォームロード時イベント
    Private Sub frmDataNullable_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'GcNumber1に数値を削除した時にNULLを許可
        Me.GcNumber1.AllowDeleteToNull = True
    End Sub

    'Nullableな結果を通常の変数で受ける
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Try
            'GcNumber1の値を受ける変数
            Dim decNrm As Decimal   '通常のDecimal型
            decNrm = Me.GcNumber1.Value

            Dim strMsg As String = String.Format("GcNumber1.Value = {0}", decNrm.ToString)
            MsgBox(strMsg, MsgBoxStyle.OkOnly, "通常のDecimal型")

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

    'Nullableな結果をNullableな変数で受ける
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Try
            'GcNumber1の値を受ける変数
            Dim decNul As Decimal?  'NullableなDecimal型
            decNul = Me.GcNumber1.Value

            Dim strMsg As String
            '値を表示
            strMsg = String.Format("GcNumber1.Value = {0}", decNul.ToString)
            MsgBox(strMsg, MsgBoxStyle.OkOnly, "NullableなDecimal型")

            '値の有効状態を表示
            strMsg = String.Format("GcNumber1.HasValue = {0}" & vbCrLf & "GcNumber1.Valus IsNothing = {1}",
                                   decNul.HasValue, Not decNul Is Nothing)
            MsgBox(strMsg, MsgBoxStyle.OkOnly, "NullableなDecimal型")

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

End Class


結果これを実行し、「通常の変数」(Button1)を押下すると以下の様になります。
この時の処理は、通常のDecimal型の変数を用意し、その変数に GcNumberValue を設定しています。 コントロールに数値が入っているときは問題無く動作します。


GcNumber の内容を全て削除して空白にしてから、「通常の変数」(Button1)を押下すると以下の様になります。
GcNumberValue がNullになる様で、変数の代入時にエラーが発生し、Catch でエラーメッセージが表示されます。


このエラーを回避するには当然なのですが、GcNumberValue と同じデータ型の変数に代入することです。 「Nullableの変数」(Button2)を押下すると以下の様になります。


Nullableの変数を宣言する時にはデータ型の最後に ? (クエスチョンマーク)を付加します。
この変数は、状態として数値が入っている場合と、NULLの場合がありますので、 この変数をそのまま計算式に使う場合には注意が必要です。 少し面倒ですが、変数がNULLかどうかで計算を分けてやる必要があります。

ただ、データベースのテーブルでは数値項目でもNULLが許可されている場合には、 Nullableの変数は使えると思います。テーブルのカラムに値を設定するSQL文を作成する時には 変数がNULLかどうかで、値にNULLとするのか、それとも値そのものを設定するのかの処理を分けることが 必要かと思います。

今回は GcNumber を例にとりましたが、日付入力コントロールの GcDate も同様に Value プロパティを持っていて、このデータ型が Date? となっていますので 変数で受ける場合はそれに合わせる必要があります。












PR

コメント

コメントを書く