- - PR -
DataGridViewの日付列にMaskedTextBoxを使用し、削除しようとしたときエラーになる
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-06-16 11:54
VB2005です。
http://dobon.net/vb/dotnet/datagridview/maskedtextboxcolumn.html 上記を参考にし、DataGridView(DGV1)にDataGridViewMaskedTextBoxColumnというカスタム列を追加しています。 クラスの記述は上記のリンク先と全く同じに記述しています。 実際の使用は下記の様にしています。
このときmaskColumn1に新規入力すると、" / / " のように書式をフォーマットします。 これは何の問題もないのですが、日付の文字列を入力(例 "2008/01/01" )したあと日付の文字列を削除(例 " / / " )すると / / は DateTime の有効な値ではありません。 とエラーになります。日付の文字列を削除してもエラーにならずそのままDBNullで認識してほしいのですが、どうすればよいのでしょうか? | ||||||||
|
投稿日時: 2008-06-16 15:32
CellParsing イベントを使って、DBNullに変換してみてはどうでしょうか?
| ||||||||
|
投稿日時: 2008-06-16 18:55
以前、リンク先のコードを使ってみたことがあるのですが、そのまま利用しているだけなら、「 / / 」でも、入力を受け付ける状態になっていたと思います。
参考にしたコードとは別の処理で、入力した値を日付変換していませんか? その時に入力値をNullかどうかチェックしてから日付型に変換するようにすれば回避できると思います。 | ||||||||
|
投稿日時: 2008-06-17 18:35
テッテさん
CellParsing イベントを使って次の様にしてみましたが、やはり同じエラーになります。
Console.WriteLine で値を調べたところ、日付の文字列を削除し別のセルに移動したときに ParsingA は " / / " ParsingB は "" と e.Value は DBNullで認識しているみたいなのですが、その後エラーになります。 ちなみに e.Value = DBNull.Value を DGV1.CurrentCell.Value = DBNull.Value などに変えてみても、結果は同じエラーでした。 If文の使い方が間違っているのでしょうか? ふりっつさん 「 / / 」でも、入力を受け付ける状態になっていた・・・ 新規入力の段階では「 / / 」で入力を受け付けるのですが 入力を完了したあと、文字列を削除するとエラーになります。 参考にしたコードとは別の処理で、入力した値を日付変換して・・・ クラスの記述は上記通り全く同じです。 日付変換に関しては上記にも書いた .Mask = "0000/00/00" ぐらいしか当てはまるところはないと思います。 フォームをロードしたときにSQLServerにアクセス、SELECT文でデータを呼び出しているだけなので 特別な記述は何もしていないと思うのですが・・・ | ||||||||
|
投稿日時: 2008-06-18 09:55
e.Value = Nothing だとどうでしょう?
If の使い方について、" / / " のような正しい日付の文字列でない場合に Nothing に変換するように書くほうがよいと思います。 この状態だと正しい入力も変換してしまうので。 | ||||||||
|
投稿日時: 2008-06-18 12:09
e.value = Nothing に直してみましたが、値を調べたらNothingになっているのですが
やはりエラーになります。 エラーの詳細はDGV1.DataErrorイベントを記述していないと下記になります。
DGV1.DataErrorイベントを記述した場合、エラー内容と選択しているセルの値を調べるため下記にしています。
このときに前述した「 / / は DateTime の有効な値ではありません。」となります。 カレントセルの値は文字列を削除する前の「"2008/01/01"」が返されています。 また、別のセルに移動しようとしても移動できずDataErrorイベントを通っています。 FormLoadイベント内に → SQLServerにアクセス → SELECT文でデータを呼び出し → 前述したDataGridViewMaskedTextBoxColumnを使用 CellParsing イベント内に → 前述したCellParsing イベントを記述 全体の流れはこれだけです。他に記述しないと駄目な部分があるのでしょうか? | ||||||||
|
投稿日時: 2008-06-18 12:20
日付列に適用するという部分を見落としていました…すみません。
e.Value = DBNull.Valueの後にe.ParsingApplied=Trueを記述するとエラーが解消されませんか? | ||||||||
|
投稿日時: 2008-06-18 12:52
ふりっつさん
できました!最終的には下記になりました。
お二方のおかげようやく解決できました。 テッテさん、ふりっつさんありがとうございました! [ メッセージ編集済み 編集者: chelsea 編集日時 2008-06-18 12:53 ] |