.NET TIPS

DateTimePickerコントロールでDBNullを扱うには?[C#、VB]

デジタルアドバンテージ 岸本 真二郎
2008/01/31

 Windowsアプリケーションで日付の表示や指定などを行う際によく利用されるDateTimePickerコントロール(System.Windows.Forms名前空間)だが、データベースのNULL値をセットすると例外が発生する。つまりDateTimePickerコントロールではコントロールが保持する値としてNULLは許されていない。

 考えてみればNULLという日付はあり得ず、それはそれでもっともな話であるが、無効な日付や、値が未入力であることを表すためにデータベースのDATETIME型のカラムにNULL値をセットする場合もあり得る。このような場合に、DateTimePickerコントロールにそのままデータセット(テーブル)をバインドすると、カラムの値がNULLの場合にコントロールで例外が発生してしまう。そこで本稿では、NULLを許容するDateTimePickerコントロールの実装を紹介する。

 なお.NET Frameworkでは、データベースにおけるNULL値はDBNullクラス(System名前空間)のインスタンスとして表され、このインスタンスはDBNullクラスの静的フィールドであるValueフィールドを使って「DBNull.Value」と記述する。

NULL値を許容するDbDateTimePickerクラス

 ここではDateTimePickerコントロールを継承したクラス(DbDateTimePicker)を作成することにより、DateTimePickerコントロールに機能を追加する。DbDateTimePickerクラスのコードは次のようになる。

//
// DbNullを許容するDateTimePickerクラス
//
public class DbDateTimePicker : System.Windows.Forms.DateTimePicker
{
  public DbDateTimePicker() {
  }

  [Bindable(true), Browsable(false)]
  public new object Value
  {
    get {
      if (base.Checked)
        return base.Value;
      else
        return DBNull.Value;
    }
    set {
      try {
        if (Convert.IsDBNull(value)) {
          base.Checked = false;
        }else{
          base.Value = Convert.ToDateTime(value);
          base.Checked = true;
        }
      } catch ( Exception ex ) {
        base.Value = Convert.ToDateTime(value);
        base.Checked = true;
      }
    }
  }
}
'
' DbNullを許容するDateTimePickerクラス
'
Public Class DbDateTimePicker
    Inherits System.Windows.Forms.DateTimePicker
  Public Sub New()
  End Sub

  <Bindable(True), Browsable(False)> _
  Public Shadows Property Value() As Object
    Get
      If MyBase.Checked Then
        Return MyBase.Value
      Else
        Return DBNull.Value
      End If
    End Get
    Set
      Try
        If Convert.IsDBNull(value) Then
          MyBase.Checked = False
        Else
          MyBase.Value = Convert.ToDateTime(value)
          MyBase.Checked = True
        End If
      Catch ex As Exception
        MyBase.Value = Convert.ToDateTime(value)
        MyBase.Checked = True
      End Try
    End Set
  End Property
End Class
NULL値を許容するDbDateTimePickerクラス(上:C#、下:VB)

 このDbDateTimePickerクラスでは、コントロールにセットされた日付を示すValueプロパティにDBNull.Valueがセットされた場合に、DateTimePickerコントロールに含まれるチェックボックスをオフにする(Checkedプロパティ)。なお、Checkedプロパティの状態がUIに反映されるようにするため、IDEのプロパティ ウィンドウでコントロールのShowCheckBoxプロパティをTrueにしておく。つまり日付が有効な場合は、チェックボックスがオンで日付が表示(修正可能)され、DBNull.Valueがセットされた場合はチェックが外れて日付部分がグレーアウトする。

 また、コントロールから値を取り出すときにチェックボックスがオフになっている場合は、ValueプロパティでDBNull.Valueを返すようにしている。なお、DBNull.Valueを返すために、Valueプロパティの型をDateTime型ではなくObject型に変更している点に注意されたい。End of Article

カテゴリ:Windowsフォーム 処理対象:DateTimePickerコントロール
使用ライブラリ:DateTimePickerコントロール(System.Windows.Forms名前空間)
使用ライブラリ:DBNullクラス(System名前空間)

この記事と関連性の高い別の.NET TIPS
DateTimePickerコントロールでコードによりカレンダーを表示するには?
[ASP.NET AJAX]Calendarコントロールで日付入力ボックスを定義するには?
[ASP.NET AJAX]PopupControlコントロールで標準コントロールにポップアップ機能を追加するには?
[ASP.NET]GridViewコントロールで各列の表示をカスタマイズするには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間