- - PR -
DataGridView内のチェックボックスの初期値について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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 | ||||
|
投稿日時: 2007-05-17 20:44
はじめまして。こんにちは。
確認ですが、DataGridView はバインドされていないのでしょうか? 試したわけではありませんが、バインドしているなら、 DBから読み込んだ値が格納されていると思いますので、 フォーカスが一度も当たらなくても関係ないような気がするのですが… それと、CellValidating よりも登録時のコードの方が気になります。 | ||||
|
投稿日時: 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 | ||||
|
投稿日時: 2007-05-18 11:53
失礼しました。その通りですね。
DataGridView.DefaultValuesNeeded イベント このイベントハンドラで初期値 False を設定してあげれば回避できると思います。 使用方法は上記ページにあるのサンプルをみてください。 もっとスマートなやり方があるのかも知れませんが…
本題とは関係ないですが、この文は不要なはずです。 OleDbCommandBuilder のヘルプを確認してください。 | ||||
|
投稿日時: 2007-05-18 13:52
KIさん、ありがとうございます!
DefaultValuesNeededイベントハンドラを使って解決できました。 実のところ、RowValidatingイベントハンドラを使って試してみようとと思っていたのですが、DefaultValuesNeededイベントハンドラを使う方がスマートですし、他人が見てもわかりやすいので使わせていただきました。 それからご指摘いただいた不要行( da.UpdateCommand = comm.GetUpdateCommand )ですが、たしかに削除して実行しても問題なかったです。 まだまだ勉強不足を痛感しました・・・トホホです。 ホントに助かりました。 |
1