none
データテーブル間のデータ反映について RRS feed

  • 質問

  • WindowsXP

    VB2005EE

     

    質問させて頂きます。よろしくお願いします。

    現在、Mainデータグリッドビュー(Mainテーブルとデータバインディングされています。)とSubMainデータグリッドビュー(SubMainテーブルとデータバインディングされています。) がwindowsフォームに各々配置されており、SubMainデータグリッドビューは入力用として使用しています。入力後、配置されたボタンにて下記ソースを実行するようにしてあります。

    内容としては、SubMainテーブルの編集後データをMainテーブルに新規追加するというものです。

     

    そこで質問があります。下記コードにてMainテーブルに反映させることは可能なのですが、なぜかSubMainテーブルの1行目のデータ(SubMainTbl.Rows(0))だけが反映されていないようなんです。しかし、2回目以降に下記コードを実行すると全てのフィールドが反映されています。この症状はどういうことなのでしょうか?そして、防ぐ手だてはあるのでしょうか?

     

           Dim MainTbl As DataTable = Me.WaterQuality_MainDataSet.Tables("Main")
            Dim SubMainTbl As DataTable = Me.WaterQuality_MainDataSet.Tables("SubMain")
            Dim LastRow As Integer = SubMainTbl.Rows.Count + 1

            Try
                Dim i As Integer

                'サブメインデータグリッドビューの頭行を選択しなければ、メインに反映されない
                Me.SubMainDataGridView.CurrentCell = Me.SubMainDataGridView(0, 0)

                For i = 1 To LastRow
                    Dim dr As DataRow = MainTbl.NewRow()
                    dr("Date") = SubMainTbl.Rows(i - 1)(1)
                    dr("TitenCode") = SubMainTbl.Rows(i - 1)(2)
                    dr("EmpID") = SubMainTbl.Rows(i - 1)(3)
                    dr("WaterNum") = SubMainTbl.Rows(i - 1)(4)
                    dr("Value") = SubMainTbl.Rows(i - 1)(5)

                    MainTbl.Rows.Add(dr)
                Next i

                Me.TextBox2.Text = Me.MainDataGridView.RowCount
            Catch ex As Exception

            End Try

    2007年12月4日 1:02

回答

  • まずCatch句を空にして例外を無視するのは止めましょう。おかしなことが発生していてもアプリケーションは結果的に無視することになってしまいます。実際、提示されたコードを見ると、Forで回す回数が一つ多く、存在しないSubMainTblの行を読もうとして、例外が発生していると思います。

     

     みやり さんからの引用

    なぜかSubMainテーブルの1行目のデータ(SubMainTbl.Rows(0))だけが反映されていないようなんです。しかし、2回目以降に下記コードを実行すると全てのフィールドが反映されています。

     

    ここの意味がはっきりわからないのですが、「全てのフィールド」というのは「全てのレコード」の間違いでしょうか?
    また、DataGridViewのRowCountは、DataGridViewの新規レコードのカウントも入ります。例えばデータテーブルに2つのレコードが存在し、そのデータテーブルがDataGridViewにバインドしていれば、データテーブルのRows.Countは2で、DataGridViewのRowCountは3になります。この辺りの勘違いはありませんでしょうか?

    2007年12月4日 4:38
    モデレータ

すべての返信

  • まずCatch句を空にして例外を無視するのは止めましょう。おかしなことが発生していてもアプリケーションは結果的に無視することになってしまいます。実際、提示されたコードを見ると、Forで回す回数が一つ多く、存在しないSubMainTblの行を読もうとして、例外が発生していると思います。

     

     みやり さんからの引用

    なぜかSubMainテーブルの1行目のデータ(SubMainTbl.Rows(0))だけが反映されていないようなんです。しかし、2回目以降に下記コードを実行すると全てのフィールドが反映されています。

     

    ここの意味がはっきりわからないのですが、「全てのフィールド」というのは「全てのレコード」の間違いでしょうか?
    また、DataGridViewのRowCountは、DataGridViewの新規レコードのカウントも入ります。例えばデータテーブルに2つのレコードが存在し、そのデータテーブルがDataGridViewにバインドしていれば、データテーブルのRows.Countは2で、DataGridViewのRowCountは3になります。この辺りの勘違いはありませんでしょうか?

    2007年12月4日 4:38
    モデレータ
  • 申し訳ない質問で、お恥ずかしい限りです。

    まさにtrapemiyaさんの言われるとおりで、基礎中の基礎ともいえるべきものでした。

    解決です。

    以後、もう少し見直してから質問するよう心がけたいと思います。

    2007年12月4日 8:43