- PR -

DataGridViewの日付列にMaskedTextBoxを使用し、削除しようとしたときエラーになる

投稿者投稿内容
chelsea
常連さん
会議室デビュー日: 2007/12/19
投稿数: 48
投稿日時: 2008-06-16 11:54
VB2005です。
http://dobon.net/vb/dotnet/datagridview/maskedtextboxcolumn.html
上記を参考にし、DataGridView(DGV1)にDataGridViewMaskedTextBoxColumnというカスタム列を追加しています。
クラスの記述は上記のリンク先と全く同じに記述しています。
実際の使用は下記の様にしています。

コード:
            Dim maskedColumn As New DataGridViewMaskedTextBoxColumn()
            With maskedColumn
                .DataPropertyName = "maskColumn1"
                .HeaderText = "maskColumn1"
                .Mask = "0000/00/00"
            End With
            DGV1.Columns.Insert(DGVEx1.Columns("Column1").Index, maskedColumn)
            DGV1.Columns.Remove("Column1")


このときmaskColumn1に新規入力すると、" / / " のように書式をフォーマットします。
これは何の問題もないのですが、日付の文字列を入力(例 "2008/01/01" )したあと日付の文字列を削除(例 " / / " )すると
/ / は DateTime の有効な値ではありません。
とエラーになります。日付の文字列を削除してもエラーにならずそのままDBNullで認識してほしいのですが、どうすればよいのでしょうか?
テッテ
ベテラン
会議室デビュー日: 2008/03/16
投稿数: 91
投稿日時: 2008-06-16 15:32
CellParsing イベントを使って、DBNullに変換してみてはどうでしょうか?
ふりっつ
会議室デビュー日: 2007/11/18
投稿数: 15
投稿日時: 2008-06-16 18:55
以前、リンク先のコードを使ってみたことがあるのですが、そのまま利用しているだけなら、「 / / 」でも、入力を受け付ける状態になっていたと思います。
参考にしたコードとは別の処理で、入力した値を日付変換していませんか?
その時に入力値をNullかどうかチェックしてから日付型に変換するようにすれば回避できると思います。
chelsea
常連さん
会議室デビュー日: 2007/12/19
投稿数: 48
投稿日時: 2008-06-17 18:35
テッテさん
CellParsing イベントを使って次の様にしてみましたが、やはり同じエラーになります。

コード:
    Private Sub DGV1_CellParsing(ByVal sender As Object, ByVal e As _
    DataGridViewCellParsingEventArgs) Handles _
    DGV1.CellParsing
        If Me.DGV1.Columns(e.ColumnIndex).HeaderText = "maskColumn1" Then
            If e IsNot Nothing Then
                Console.WriteLine(e.Value & "  ParsingA")
                e.Value = DBNull.Value
                Console.WriteLine(e.Value & "  ParsingB")
            End If
        End If
    End Sub


Console.WriteLine で値を調べたところ、日付の文字列を削除し別のセルに移動したときに
ParsingA は " / / "
ParsingB は ""
と e.Value は DBNullで認識しているみたいなのですが、その後エラーになります。
ちなみに e.Value = DBNull.Value を DGV1.CurrentCell.Value = DBNull.Value
などに変えてみても、結果は同じエラーでした。

If文の使い方が間違っているのでしょうか?



ふりっつさん
「 / / 」でも、入力を受け付ける状態になっていた・・・

新規入力の段階では「 / / 」で入力を受け付けるのですが
入力を完了したあと、文字列を削除するとエラーになります。

参考にしたコードとは別の処理で、入力した値を日付変換して・・・

クラスの記述は上記通り全く同じです。
日付変換に関しては上記にも書いた
.Mask = "0000/00/00"
ぐらいしか当てはまるところはないと思います。

フォームをロードしたときにSQLServerにアクセス、SELECT文でデータを呼び出しているだけなので
特別な記述は何もしていないと思うのですが・・・
テッテ
ベテラン
会議室デビュー日: 2008/03/16
投稿数: 91
投稿日時: 2008-06-18 09:55
e.Value = Nothing だとどうでしょう?

If の使い方について、" / / " のような正しい日付の文字列でない場合に
Nothing に変換するように書くほうがよいと思います。
この状態だと正しい入力も変換してしまうので。
chelsea
常連さん
会議室デビュー日: 2007/12/19
投稿数: 48
投稿日時: 2008-06-18 12:09
e.value = Nothing に直してみましたが、値を調べたらNothingになっているのですが
やはりエラーになります。

エラーの詳細はDGV1.DataErrorイベントを記述していないと下記になります。
コード:
  / / は DateTime の有効な値ではありません。文字列は有効なDataTimeではありませんでした。
   -- 中略 --
この規定のダイアログを置き換えるにはDataErrorイベントをハンドルしてください。



DGV1.DataErrorイベントを記述した場合、エラー内容と選択しているセルの値を調べるため下記にしています。
コード:
    Private Sub DGV1_DataError(ByVal sender As Object, _
    ByVal e As DataGridViewDataErrorEventArgs) Handles _
    DGV1.DataError
        Console.WriteLine(String.Format(e.Exception.Message))
        Console.WriteLine(DGV1.CurrentCell.Value)
    End Sub


このときに前述した「 / / は DateTime の有効な値ではありません。」となります。
カレントセルの値は文字列を削除する前の「"2008/01/01"」が返されています。
また、別のセルに移動しようとしても移動できずDataErrorイベントを通っています。



FormLoadイベント内に
  → SQLServerにアクセス
  → SELECT文でデータを呼び出し
  → 前述したDataGridViewMaskedTextBoxColumnを使用
CellParsing イベント内に
  → 前述したCellParsing イベントを記述

全体の流れはこれだけです。他に記述しないと駄目な部分があるのでしょうか?
ふりっつ
会議室デビュー日: 2007/11/18
投稿数: 15
投稿日時: 2008-06-18 12:20
日付列に適用するという部分を見落としていました…すみません。
e.Value = DBNull.Valueの後にe.ParsingApplied=Trueを記述するとエラーが解消されませんか?
chelsea
常連さん
会議室デビュー日: 2007/12/19
投稿数: 48
投稿日時: 2008-06-18 12:52
ふりっつさん
できました!最終的には下記になりました。
コード:

Private Sub DGV1_CellParsing(ByVal sender As Object, _
ByVal e As DataGridViewCellParsingEventArgs) Handles _
DGV1.CellParsing
If Me.DGV1.Columns(e.ColumnIndex).HeaderText = "maskColumn1" Then
If e IsNot Nothing Then
e.Value = DBNull.Value
e.ParsingApplied = True
End If
End If
End Sub


お二方のおかげようやく解決できました。

テッテさん、ふりっつさんありがとうございました!

[ メッセージ編集済み 編集者: chelsea 編集日時 2008-06-18 12:53 ]

スキルアップ/キャリアアップ(JOB@IT)