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

  • 質問

  • visualbasic2005EE

    windowsXP

     

    お世話になっております。

    データバインディングされたデータグリッドビューにてエンターキーを押すたびに、特定のカラムのセルに行番号を表示させるようにコーディングしてあります。あらかじめ行数を何行かに設定しておいて、この操作をしてみると上手くいくことが分かりましたが、最終行に差し掛かり、データ入力後エンターキーを押すとエラー表示されました。

    その内容は、dataerrorイベントにて対処するとなっていました。そこで、そのイベントを組んでやって、最終行にデータ入力後エンターキーにより行番号取得&新規行の追加を行いたいと思っております。何か良い方法はないでしょうか?

    ちなみにコードについては、下記のとおりです。

     

        Private Sub Meisai_masterDataGridView_CellEnter(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) _
        Handles Meisai_masterDataGridView.CellEnter

            Dim 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 Sub

     

        Private Sub Meisai_masterDataGridView_DataError(ByVal sender As Object, _
             ByVal e As DataGridViewDataErrorEventArgs) _
             Handles Meisai_masterDataGridView.DataError
          

      ??????セルエンターイベントが実行されるために、最終行にてデータ入力を行ってエンタキーを押すとエラーがでます。そ   の解除としてデータエラーイベントを利用したいと思っています。

     

     

        End Sub

    2007年10月15日 16:06

回答

  •  はなはなはな さんからの引用

    あ、今気づきましたが、みやりさんは、以前に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

    2007年10月16日 16:55
    モデレータ

すべての返信

  • 一番気になるのは、CellEnterイベントで処理するの?ってことですが、

    もしかしてCellEnterはセルでEnterキーが押された時に発生するイベントだと思われてます?

     

    その他も突っ込みいれたいけれども、1つずついきます。(^^)

    2007年10月16日 6:05
  • 回答ありがとうございます。

    え~と、データグリッドビューのセルを選択したと同時に発生するのではないのでしょうか?

    もちろんエンターも含めて・・・

    2007年10月16日 8:26
  •  

    >え~と、データグリッドビューのセルを選択したと同時に発生するのではないのでしょうか?

    >もちろんエンターも含めて・・・

     

    はい。そうです。

    Enterキーを入力するとセル移動が起こるから、結局このイベントも起こるのですが、

    例えばマウスでカチカチといろいろなセルをクリックしていったとすると、

    その都度、この処理が走りますが、それは承知の上、ということでしょうか?

    まぁ、走っても害はないかもしれませんが。

     

    あと、全部の行の値をセットされていますが、これは必要でしょうか?

    ソートとかされたときは値をセットしなおす、ということでしょうか?

    いや、新規の行だけセットすればいいのかな、と感じますので。

     

    すみません、いろいろ聞いてしまって。気になるもので。(^^;

    2007年10月16日 8:48
  • あ、今気づきましたが、みやりさんは、以前にtrapemiyaさんとやりとりされてますね。

    そちらを見たらわかるのかな。

    ちょっと出直してきます。

    2007年10月16日 9:16
  • お答えいたします。

    全ての行をセットする意味についてですが、実はボタンにて行削除や行挿入、コピーペーストを実行するプログラムを組んであり、全ての作業が終了し、保存をしたとします。ちなみに1列目(column(0))は、自動番号振りの列にしてあり、各セルを選択する度に円ターイベントにて番号を振るようにしてあります。

    そして、保存されたデータを再び読み込んだとします。すると、主キーを1列目に設定しているため、行の順番がバラバラになっていまいます。そこで、エンターイベントにて2列目に番号を上から順番に振る必要が出てきたのです。こうすれば、読み込む際に2列目にソートをかけてやれば、思ったとおり(入力したとおり)のデータを呼び出すことができます。

    以上が、行セットの意図です。

     

    よろしくお願いします。

    2007年10月16日 12:25
  • 根本から見直されたほうがよいと思いますよ。

     

    まず、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

    2007年10月16日 13:59
  •  はなはなはな さんからの引用

    あ、今気づきましたが、みやりさんは、以前に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

    2007年10月16日 16:55
    モデレータ
  • 有り難うございます!

    なるほど、データグリッドビューに新規行が追加されたときに実行するコードですね。

    編集操作を行えるようにすることで、上手くいくことがわかりました。

     

    別件で、質問したいことがありますので、またスレッドたててみたいと思います。

    本当にありがとうございました!!

    2007年10月17日 8:33