トップ回答者
バインディングされたデータグリッドビューで最終行のセルに入力後、エンターキーを押すとエラーがでる現象について

質問
-
visualbasic2005EE
windowsXP
お世話になっております。
データバインディングされたデータグリッドビューにてエンターキーを押すたびに、特定のカラムのセルに行番号を表示させるようにコーディングしてあります。あらかじめ行数を何行かに設定しておいて、この操作をしてみると上手くいくことが分かりましたが、最終行に差し掛かり、データ入力後エンターキーを押すとエラー表示されました。
その内容は、dataerrorイベントにて対処するとなっていました。そこで、そのイベントを組んでやって、最終行にデータ入力後エンターキーにより行番号取得&新規行の追加を行いたいと思っております。何か良い方法はないでしょうか?
ちなみにコードについては、下記のとおりです。
Private Sub Meisai_masterDataGridView_CellEnter(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) _
Handles Meisai_masterDataGridView.CellEnterDim MeisaiTbl As DataTable = Me.Sekisan_meisaiDataSet.Tables("meisai_master")
Dim i As Integer
Try
For i = 1 To Meisai_masterDataGridView.RowCount - 1
MeisaiTbl.Rows(i - 1)(1) = i
Next
Me.Validate()
Me.Meisai_masterBindingSource.EndEdit()Catch ex As Exception
End Try
End SubPrivate Sub Meisai_masterDataGridView_DataError(ByVal sender As Object, _
ByVal e As DataGridViewDataErrorEventArgs) _
Handles Meisai_masterDataGridView.DataError
??????セルエンターイベントが実行されるために、最終行にてデータ入力を行ってエンタキーを押すとエラーがでます。そ の解除としてデータエラーイベントを利用したいと思っています。
End Sub
回答
-
はなはなはな さんからの引用 あ、今気づきましたが、みやりさんは、以前にtrapemiyaさんとやりとりされてますね。
そちらを見たらわかるのかな。
ちょっと以前のことはあまり覚えていないのですが(^^; いい悪いは別として、とりあえず簡単なテストコード書いてみました。
正常な動作なのにDataErrorイベントで処理しようとするのはあまり良くないですね。
Private Sub DataGridView1_CellEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEnter
Dim i As Integer
Try
For i = 0 To TESTBindingSource.List.Count - 1
TESTBindingSource.List(i)(1) = i
Next
If DataGridView1.CurrentRow.IsNewRow Then
DirectCast(TESTBindingSource.List(i), DataRowView).Row.BeginEdit()
DataGridView1.Item(1, DataGridView1.CurrentRow.Index).Value = i + 1
End If
Catch ex As Exception
End Try
End Sub
すべての返信
-
>え~と、データグリッドビューのセルを選択したと同時に発生するのではないのでしょうか?
>もちろんエンターも含めて・・・
はい。そうです。
Enterキーを入力するとセル移動が起こるから、結局このイベントも起こるのですが、
例えばマウスでカチカチといろいろなセルをクリックしていったとすると、
その都度、この処理が走りますが、それは承知の上、ということでしょうか?
まぁ、走っても害はないかもしれませんが。
あと、全部の行の値をセットされていますが、これは必要でしょうか?
ソートとかされたときは値をセットしなおす、ということでしょうか?
いや、新規の行だけセットすればいいのかな、と感じますので。
すみません、いろいろ聞いてしまって。気になるもので。(^^;
-
お答えいたします。
全ての行をセットする意味についてですが、実はボタンにて行削除や行挿入、コピーペーストを実行するプログラムを組んであり、全ての作業が終了し、保存をしたとします。ちなみに1列目(column(0))は、自動番号振りの列にしてあり、各セルを選択する度に円ターイベントにて番号を振るようにしてあります。
そして、保存されたデータを再び読み込んだとします。すると、主キーを1列目に設定しているため、行の順番がバラバラになっていまいます。そこで、エンターイベントにて2列目に番号を上から順番に振る必要が出てきたのです。こうすれば、読み込む際に2列目にソートをかけてやれば、思ったとおり(入力したとおり)のデータを呼び出すことができます。
以上が、行セットの意図です。
よろしくお願いします。
-
根本から見直されたほうがよいと思いますよ。
まず、CellEnterの中でMe.Validateがあると、カーソルを移せないですね。
今、Try Catchでつかまえて、Catchで何もしていないので、たまたま移せているだけです。
ためしにTry Catchをはずしてみてください。
あと、テーブルに直接値をセットされていますが、DataGridView上で値をセットし、
テーブルへのアップデートはBindingSourceに任せるのがよいかと。
DataErrorはこちら。
http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.datagridview.dataerror(VS.80).aspx
-
はなはなはな さんからの引用 あ、今気づきましたが、みやりさんは、以前にtrapemiyaさんとやりとりされてますね。
そちらを見たらわかるのかな。
ちょっと以前のことはあまり覚えていないのですが(^^; いい悪いは別として、とりあえず簡単なテストコード書いてみました。
正常な動作なのにDataErrorイベントで処理しようとするのはあまり良くないですね。
Private Sub DataGridView1_CellEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEnter
Dim i As Integer
Try
For i = 0 To TESTBindingSource.List.Count - 1
TESTBindingSource.List(i)(1) = i
Next
If DataGridView1.CurrentRow.IsNewRow Then
DirectCast(TESTBindingSource.List(i), DataRowView).Row.BeginEdit()
DataGridView1.Item(1, DataGridView1.CurrentRow.Index).Value = i + 1
End If
Catch ex As Exception
End Try
End Sub