- PR -

DataGridViewのチェックについて

投稿者投稿内容
なび
ぬし
会議室デビュー日: 2007/08/27
投稿数: 273
投稿日時: 2008-09-18 19:13
こんばんは。
質問ばかりですいません。
DataGridViewのチェックについて1つ教えて下さい。

Private Sub dgv_DataError(ByVal sender As Object, ByVal e As DataGridViewDataErrorEventArgs) Handles dgv.DataError

If Not (e.Exception Is Nothing) Then
MessageBox.Show("数字で入力して下さい", Me.Text, _
Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Exclamation)
e.Cancel = False
End If
End Sub
'******************************************************************************Private Sub dgv_CellValidating(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles dgv.CellValidating

If ActiveControl Is sender OrElse ActiveControl.CausesValidation = False Then
Exit Sub
End If
'*****
If e.ColumnIndex = 6 Then
If e.FormattedValue > dgvBLGSHIPMENT.Rows(e.RowIndex).Cells(5).Value Then
MessageBox.Show("数が超えています", Me.Text, _
Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Exclamation)
e.Cancel = True
End If
End If
End Sub

とあります。
ある数字を入力し「数が超えています」のエラーメッセージが
表示されるのはいいのですが、そのあと入力した数を空白にしたいのですが

どうしても「数字で入力して下さい」のエラーが表示されてしまいます。
空白はOKとしたいのですが・・

どのようにするとよいのか
ご教授いただけませんか?

よろしくお願いします。
カドルドエグ
常連さん
会議室デビュー日: 2008/05/29
投稿数: 25
投稿日時: 2008-09-19 09:40
DataErrorイベント
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.datagridview.dataerror(VS.80).aspx

の処理が走るタイミングは様々です。
まして、
>If Not (e.Exception Is Nothing) Then
としていたら、そのタイミングの度にIf内の処理が走ることになります。

もし今のままを生かす場合は、
DataGridViewDataErrorEventArgs.Exception プロパティ
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.datagridviewdataerroreventargs.exception.aspx
のサンプルにあるように、条件をさらに特定させた上で処理を行うとよいと思います。
なび
ぬし
会議室デビュー日: 2007/08/27
投稿数: 273
投稿日時: 2008-09-19 11:14
カドルドエグさん、ありがとうございます。

If e.Exception IsNot Nothing AndAlso e.Context = DataGridViewDataErrorContexts.Commit Then
MessageBox.Show("数字で入力して下さい", Me.Text, _
Windows.Forms.MessageBoxButtons.OK,Windows.Forms.MessageBoxIcon.Exclamation)
e.Cancel = False
End If

とか、いろいろe.Context を使ってみましたが
うまくいきません。

なんとか空白はOKとしたいのですが・・

なかなかDataGridViewを使っての入力処理も
難しいですね。
カドルドエグ
常連さん
会議室デビュー日: 2008/05/29
投稿数: 25
投稿日時: 2008-09-19 11:49
>空白はOKとしたい
そうなると、DataErrorイベントで細かく条件分け等々とするよりも、
別なイベントでチェックをかけた方がよさそうですね。
サンプルコードを見ると、CellValidatingイベントも使用されているようなので、
そこにチェック関連を集中させてみてはいかがでしょうか?

>なかなかDataGridViewを使っての入力処理も難しいですね。
私もちょうど業務でDataGridViewを多く使っていますが、
開発効率等を考慮した結果、DataGridViewは飽くまでデータを「表示させるだけ」
と使い道を限定する仕様になりました。
ごく一部で例外的にDataGridViewで表示・編集を行っている画面がありますが、
内部のコードは(その画面自体の仕様の都合もありますが)かなり複雑です。

他の箇所 = DataGridViewを表示のみで使っている画面では、
テキストボックス等で別途入力専用領域を作り、
ボタンを押すことで(当方の場合はBindingSourceを使って)DataGridViewに反映、
さらに別なボタンで最終的な更新、という形式にしています。
なび
ぬし
会議室デビュー日: 2007/08/27
投稿数: 273
投稿日時: 2008-09-19 14:10
 大変丁寧な回答ありがとうございます。

テキストボックス等で別途入力専用領域を作り
とありますが、複数行の入力であると
複数配置するのでしょうか?

難しいですね。

MultiRowとかを使うべきなのでしょうか・・
カドルドエグ
常連さん
会議室デビュー日: 2008/05/29
投稿数: 25
投稿日時: 2008-09-19 14:42
(一つ前のスレッド)
>いろいろe.Context を使ってみましたがうまくいきません。
どう上手くいかないのかここからはちょっと読み取りにくいですが…。
DataGridViewDataErrorContexts 列挙体
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.datagridviewdataerrorcontexts(VS.80).aspx
「Commit」の条件で「"数字で入力して下さい"」としていますが、メッセージに合わせた
エラーの種類なら「Formatting」か「Parsing」が適していると思います。
(正直あまり使ったことが無いので説明文からの推測です…)



>複数行の入力であると複数配置するのでしょうか?
入力領域:表示用DataGridViewは飽くまで1:1です。
なびさんが心配されているのは、複数行の「入力」ではなく「更新」のことではないでしょうか。

前述で、全体の更新の前に「反映」という段階を設けていることを書きましたが、
これは複数行の更新に対応するためです。
DataGridViewだけでの編集にしろ、入力領域を別途設けたやり方にしろ、
大抵は入力し終わってすぐにDBに反映する処理は入れないと思います。(技術的には可能ですが)

基本的には、一時的にDataGridViewとバインドしているDataTableに保存され、
それをTableAdapterなどを介してDBに送ります。
こちらで行っているやり方 = 「反映」は、ちょうど「DataTableに一時保存する処理」にあたります。
入力→反映、入力→…を繰り返すことで複数件のデータをDataTableに蓄積させ、
(当方の場合は)TableAdapterのUpdateメソッドで「複数件の登録」を実現させています。

ただ、このやり方だと「入力→反映ボタンクリック→DataTableへ」といちいちワンクッションはさまないといけないので、数十件などといった大量のデータを一気に登録したいときは向かないでしょう。

DataGridViewのみならば、入力→(こちらでいう)反映が行の選択を変えるだけで行われるのでその面ではとても楽です。
その代わり、今回のご質問で出たようなエラーチェックを行またはセルの選択(フォーカス)が変化するタイミング等で逐一行わなくては危険です。
因みにこちらではボタンクリックのタイミングで入力内容のエラーチェックを行っています。
なび
ぬし
会議室デビュー日: 2007/08/27
投稿数: 273
投稿日時: 2008-09-19 15:26
何度もありがとうございます。

まず、
If e.Exception IsNot Nothing AndAlso e.Context = DataGridViewDataErrorContexts.Parsing Then
MessageBox.Show("数字で入力して下さい", Me.Text, _
Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Exclamation)
e.Cancel = True
End Ifとしてみました。結果エラーメッセージは表示されませんが
Enterで次に移るようになっていますが、カーソルが移りません。
(Formattingも同じです)

それとDataErrorのイベントプロシージャをとってしまうと
どうしても規定のエラーが表示されてしまいます。

そしてもう1点、数字で入力して下さいのエラーを表示した状態で
CausesValidationがFalseの終了ボタンを押しても
エラーで終了できない点です。

データベースへの更新は最後にボタンを押して
SqlDataAdapterで行っています。
カドルドエグ
常連さん
会議室デビュー日: 2008/05/29
投稿数: 25
投稿日時: 2008-09-19 16:02
>結果エラーメッセージは表示されませんが
こちらでもテストしてみたところ、
「既定のデータ型と違う(今回の場合は『数字でない』ということ)」
のをチェックするためのContextは、
DataGridViewDataErrorContexts.Parsing or DataGridViewDataErrorContexts.Commit
でした。

DataErrorイベントにブレークポイントを置き、
とまったときのe.Contextをウォッチウィンドウで見るとDataErrorイベントが発生した要因であるDataGridViewDataErrorContextsが何であるかがわかります。

>Enterで次に移るようになっていますが、カーソルが移りません。
>数字で入力して下さいのエラーを表示した状態で
>CausesValidationがFalseの終了ボタンを押しても
>エラーで終了できない
これらは「e.Cancel = True」の設定からくる状態です。
Falseにすればカーソルは再び移動するようになりますが、
それまでそのセルに入力していた値は消されます。

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