教えて下さい。
以下のように、フォーム上に"DataGridView"を貼り付け、ダブルクリックしたら別フォームを起動し、
そこで選択されたデータを再度テーブルに検索しに行き、該当のデータを表示させるような仕組みを
考えています。
※ 別フォームで選択された発注番号は、PIN_発注番号 という項目に格納されます。
そこで、1件目の取得はうまく表示されるものの、2件目はどうしても1行目にデータが表示され、
2行目は空白の1行目と3行目に表示されるようになってしまいます。
なんとか2件目以降に選択されたものに関しては、前回の行の後ろへ表示させるような事を考えて
いますが、何か良い手はないでしょうか。。。。
教えて下さい。
よろしくお願いします。
《記述内容》
'DataGridViewのセルダブルクリック時処理
Private Sub G_仕入入力_CellDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles G_仕入入力.CellDoubleClick
Dim frm_発注データ As New 発注データ検索
frm_発注データ.ShowDialog()
Dim PIN_発注番号 As String
Dim KIN_発注日付 As String
Dim KIN_発注先コード As String
KIN_発注日付 = ""
KIN_発注先コード = ""
Dim Connection As New MySqlConnection
Dim Command As MySqlCommand
Dim DataReader As MySqlDataReader
PIN_発注番号 = frm_発注データ.P_発注番号 '結果プロパティから
frm_発注データ.Dispose()
frm_発注データ = Nothing
If PIN_発注番号 <> "" Then
'接続文字列を設定
Connection.ConnectionString = "server=localhost;database=DB_KIKAN;user id=root;password=000000"
'オープン
Connection.Open()
'コマンド作成
Command = Connection.CreateCommand
'SQL作成
Command.CommandText = "SELECT 発注日付,発注先コード FROM T_発注データ WHERE 発注番号 = '" + PIN_発注番号 + "'"
'データリーダーにデータ取得
DataReader = Command.ExecuteReader
'データを全件出力
Do Until Not DataReader.Read
If IsDBNull(DataReader.Item("発注日付")) Then
KIN_発注日付 = ""
Else
KIN_発注日付 = DataReader.Item("発注日付").ToString
End If
If IsDBNull(DataReader.Item("発注先コード")) Then
KIN_発注先コード = ""
Else
KIN_発注先コード = DataReader.Item("発注先コード").ToString
End If
Loop
Dim data_row As DataRow = dtTable.NewRow()
data_row("発注番号") = PIN_発注番号
data_row("発注日付") = KIN_発注日付
dtTable.Rows.Add(data_row)
'DataGridViewにデータを表示する
G_仕入入力.DataSource = dtSet.Tables(0)
'DataGridViewの最終行を非表示にする
G_仕入入力.AllowUserToAddRows = False
End If
End Sub
質問文が客観的かつ具体的でないので、1件目・2件目や、1行目・2行目が何を指しているのか、さっぱり理解できません。
他の人が読んでも理解できるよう、具体的に質問しましょう。
うまく質問の意図を伝えられず申し訳ありません。
1件目、2件目というのは回数で、1回目に1行目をダブルクリックして取得された結果が1行目に
表示され、2回目に2行目をダブルクリックして取得された値が、本来は2行目に表示させたいものの、
なぜか1行目に表示されてしまいます。
結果として、DataGridViewの各行でダブルクリックされて取得されたデータは、そのダブルクリックされた
行へ表示させて欲しいというのが目的となります。
ご理解頂けたでしょうか。。。
よろしくお願いします。
なるほど、意図は分かりました。
ただ、ソースを見ると、DataGridViewのDataSourceにdtSet.Tables(0)というものをセットしていますが、これは何でしょうか?
おそらく、DataGridViewはdtSet.Tables(0)を表示しているので、この中身がおかしいということになりますが、
提示コードにはの中身を処理している部分が見当たりません。
また、その他DataTableらしきdtTableというものもありますが、これは該当のDataGridViewと何か関係があるのでしょうか?
その他、ツッコミどころが満載なのですが、まずは上記を整理することが先決ですね。
データベースを扱うものの常識として、
「データベースのデータに順番は無い」
というものがあります。レコード単位で
全てのデータは等価な存在です。登録順
などを示す情報は残りません。
このため、順番を指定したいのであれば、
自分で順番を保証できるようなデータを
作ります。登録順のインデックスや伝票
番号などです。
その後、そのデータでソートする事で
順番を保証できます。
また、画面の行数とも何の関連もあり
ませんので、
> 結果として、DataGridViewの各行でダブルクリックされて取得されたデータは、そのダブルクリックされた
> 行へ表示させて欲しいというのが目的となります。
そのような動きになる事はありません。
行を一意に識別できるような情報を付加し、
それが一致するデータを設定するなどの
プログラムを自分で考える必要があります。
私の記述の仕方がおかしいと思われますが、データテーブルを
Public dtTable As DataTable
のように宣言し、そこへ読み込んできたデータを書き出す(バインド)ような
記述をしたつもりです。。。
記載した箇所にはデータテーブルの宣言がなく申し訳ありません。
教えて頂いた、DtSet.Tables(0) の中身処理の記載がないとありましたが、
やはりここでの処理が必要なのですね・・・