- PR -

DataGridView内のチェックボックスの初期値について

1
投稿者投稿内容
きんたろあめ
会議室デビュー日: 2007/05/17
投稿数: 5
投稿日時: 2007-05-17 18:02
みなさんはじめまして。
いつもこの会議室を参考にさせていただいてます。
.Net2005でDBがAccess2000で開発している初心者です。

本題なのですが、DataGridViewにカラムを3つ設定しました。
タイプは左からテキストボックス、テキストボックス、チェックボックスとなっています。
セルの入力をして、登録のボタンを押すとDBが書き変わる、といった処理をやりたいのですが、実行時にチェックボックスのあるセルに一度もフォーカスをあてずに登録ボタンを押すとエラーが起きてしまいます。
エラーの内容は、Boolean型の項目にNullが入っている、という内容でした。
私としてはチェックボックスのセルが一度もフォーカスを得なかった場合もFalseを設定したいのです。
Web上でだいぶ検索しましたが記載がなかったため、質問に至りました。
セルの入力チェックを行うCellValidatingイベント内のコードを記載します。
よろしくお願いします。

Private Sub dgv_CellValidating(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles dgv.CellValidating
Dim str as String

' セルの値を変数へ
str = e.FormattedValue

' カラム数で判断する
Select Case e.ColumnIndex
Case 0
ここにチェックの内容が記述してあります。
チェックでエラーの場合、Exit Subで処理を抜けて
            DataErrorイベントに入ります。
Case 2
Case 0と同じです
' Case3はチェックボックスのため、チェックは行ってません
End Select

  ' 値の確定(コミット?)
Me.dgv(e.ColumnIndex, e.RowIndex).Value = str
Me.dgv.RefreshEdit()

End Sub
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-05-17 20:44
はじめまして。こんにちは。

確認ですが、DataGridView はバインドされていないのでしょうか?
試したわけではありませんが、バインドしているなら、
DBから読み込んだ値が格納されていると思いますので、
フォーカスが一度も当たらなくても関係ないような気がするのですが…
それと、CellValidating よりも登録時のコードの方が気になります。
きんたろあめ
会議室デビュー日: 2007/05/17
投稿数: 5
投稿日時: 2007-05-18 10:50
KIさん、ご返信どうもありがとうございます。

>確認ですが、DataGridView はバインドされていないのでしょうか?

すべてバインド列として追加しましたのでバインドはされていると思います。

>試したわけではありませんが、バインドしているなら、
>DBから読み込んだ値が格納されていると思いますので、
>フォーカスが一度も当たらなくても関係ないような気がするのですが…

実行時は行を新しく追加し、2つのテキストボックスを入力後、チェックボックスのセルにフォーカスを当てずに登録のボタンを押す、という操作をしました。
行を新しく追加した場合でもバインドの有無って関係あるんでしょうか?

>それと、CellValidating よりも登録時のコードの方が気になります。

登録時コードの記載を忘れておりました。ごめんなさい。
記載しておきます。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1_Click.Click
   Dim da As OleDbDataAdapter
Dim sql As String
Dim ds As DataSet
Dim comm As OleDbCommandBuilder

' SQL文作成
sql = "SELECT *" & _
" FROM" & _
" バインド先テーブル名"
' ORDER文作成
sql = sql & " ORDER BY key1"

' コネクションOPEN処理

' SQL文を実行して結果をDataSetに格納
da = New OleDbDataAdapter(sql, cnn)
ds = New DataSet
da.Fill(ds, "バインド先テーブル名")

' DBの更新処理
comm = New OleDbCommandBuilder(da)
da.UpdateCommand = comm.GetUpdateCommand
da.Update(データセット名, "バインド先テーブル名")

' コネクションClose処理

End Sub
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-05-18 11:53
失礼しました。その通りですね。

DataGridView.DefaultValuesNeeded イベント

このイベントハンドラで初期値 False を設定してあげれば回避できると思います。
使用方法は上記ページにあるのサンプルをみてください。
もっとスマートなやり方があるのかも知れませんが…

引用:

da.UpdateCommand = comm.GetUpdateCommand


本題とは関係ないですが、この文は不要なはずです。
OleDbCommandBuilder のヘルプを確認してください。
きんたろあめ
会議室デビュー日: 2007/05/17
投稿数: 5
投稿日時: 2007-05-18 13:52
KIさん、ありがとうございます!
DefaultValuesNeededイベントハンドラを使って解決できました。
実のところ、RowValidatingイベントハンドラを使って試してみようとと思っていたのですが、DefaultValuesNeededイベントハンドラを使う方がスマートですし、他人が見てもわかりやすいので使わせていただきました。
それからご指摘いただいた不要行( da.UpdateCommand = comm.GetUpdateCommand )ですが、たしかに削除して実行しても問題なかったです。

まだまだ勉強不足を痛感しました・・・トホホです。
ホントに助かりました。
1

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