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

 

.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名前空間)



TechTargetジャパン

Insider.NET フォーラム 新着記事

  • srcObjectによる動画表示/ゼロ幅の画像などを解説 (2017/3/3)
     HTMLMediaElementインタフェースに追加されたsrcObjectプロパティ、メタデータ付与の観点からHTML 5.1で復活したrevプロパティなどを紹介する
  • Listに要素を追加/挿入するには? (2017/3/1)
     List<T>オブジェクトの作成時に要素を追加する方法や、Add/AddRange/Insert/InsertRangeメソッドを使いList<T>コレクションに要素を追加する方法を紹介する
  • URI (2017/2/28)
     URIはさまざまな種類のリソースを統一的に参照するための識別子。URIは、広く使われている「URL」という用語を包含する概念である
  • Python 3.6で追加された新機能をザックリ理解 (2017/2/24)
     2016年12月にPythonの最新版であるバージョン3.6がリリースされた。本稿ではその中でも特徴的な新機能を幾つか紹介していく

Insider.NET 記事ランキング

本日 月間