- PR -

VB.NET DataGridでクリックされた行のデータを別のFormに渡したい

1
投稿者投稿内容
co.jp
常連さん
会議室デビュー日: 2004/03/19
投稿数: 20
投稿日時: 2004-12-20 10:32
おはようございます。co.jpです。
VB.NETでプログラムを行っております。
DataGridをクリックした時のカーソル行をテキストに出力し、ボタンを押した時にカーソル行=Table.Rows(i)としてデータを渡すようにしているのですが、意図した通りのデータが入りません。
このFormでは、マスターデータから、該当ユーザーの条件に見合うデータをLoadされた時にDataGridに表示させています。
実行結果から判断すると、条件指定されたDataGridのデータのTable.Rows(i)のデータを渡しているのではなく、マスターデータのTable.Rows(i)を渡しているのだと思います。
私なりに調べましたが、改善するに至りませんでした。
ソースを表示しますので、お気付きの点がありましたら、ご助言をお願いします。
_______________________________________________________________________________

Private Sub フォーム_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

’表示するフィールドの指定
OleDbDataAdapter1.SelectCommand.CommandText = "select フィールド1, フィールド2, フィールド3, フィールド4 from マスターデータ"
OleDbDataAdapter1.Fill(Dataset11)

’DataGridに表示させたいレコードの条件設定
Dim dtview As DataView
dtview = New DataView(Dataset11.Tables("マスターデータ"), "フィールド1 = '" + 条件.Text + "'", "フィールド2 DESC", DataViewRowState.CurrentRows)
DataGrid1.DataSource = dtview

End Sub


Private Sub DataGrid1_mouseup(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles DataGrid1.MouseUp

’マウスのカーソル位置を表示させる。
Dim hitinfo As DataGrid.HitTestInfo
hitinfo = (CType(sender, DataGrid).HitTest(e.X, e.Y))
TextBox4.Text = hitinfo.Row.ToString

End Sub


    Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button.Click
Dim frm変更画面 As New 変更画面
Dim i As Integer

     dtview = New DataView(Dataset11.Tables("マスターデータ"), "フィールド1 = '" + 条件.Text + "'", "フィールド2 DESC", DataViewRowState.CurrentRows)
DataGrid1.DataSource = dtview

If TextBox4.Text <> Nothing Then

’カーソル行のデータをfrm変更画面に渡す
TextBox4.Text = i

frm変更画面.TextBox1.Text = dtview.Table.Rows(i)("フィールド1").ToString
frm変更画面.TextBox2.Text = dtview.Table.Rows(i)("フィールド2").ToString
frm変更画面.TextBox3.Text = dtview.Table.Rows(i)("フィールド3").ToString
frm変更画面.Show()

End If

End Sub
Os_
ベテラン
会議室デビュー日: 2003/04/16
投稿数: 77
投稿日時: 2004-12-20 10:55
下記で使われているDataView.Tableは、DataViewの元となるDataTableを参照することになりますので、そのままの現象が現れています。

>frm変更画面.TextBox1.Text = dtview.Table.Rows(i)("フィールド1").ToString
>frm変更画面.TextBox2.Text = dtview.Table.Rows(i)("フィールド2").ToString
>frm変更画面.TextBox3.Text = dtview.Table.Rows(i)("フィールド3").ToString

必要な行データは、dtview(i).Rowで取得できますが、DataGridで並び替えが行われるとずれますので、
実際にカレント行を取得取得するには、
Dim bmb as BindingManagerBase = DataGrid1.BindingContext(dg.DataSource, dg.DataMember)
Dim dr as DataRow = CType(bmb.Current,DataRowView).Row
で取得できます。

修正:DataView → DataRowView
_________________
Tips集Library集を公開

[ メッセージ編集済み 編集者: Os_ 編集日時 2004-12-20 15:16 ]
co.jp
常連さん
会議室デビュー日: 2004/03/19
投稿数: 20
投稿日時: 2004-12-20 13:33
Os_さんアドバイスありがとうございます。

プログラムの修正を行い、実行しましたが例外エラーが出てしまいました。
「'System.InvalidCastException' のハンドルされていない例外がWindowsApplication1.exe で発生しました。追加情報 : 指定されたキャストは有効ではありません。」が Dim dr As DataRow = CType(bmb.Current, DataView).Table.Rows(i)の個所で出てしまいます。
私の理解が至っていないのでしたら、もう一度ご教授頂けると幸いです。

以下、コード

Dim frm変更画面 As New 変更画面
Dim i As Integer

Dim bmb As BindingManagerBase = DataGrid1.BindingContext(DataGrid1.DataSource, DataGrid1.DataMember)
Dim dr As DataRow = CType(bmb.Current, DataView).Table.Rows(i)

'カーソル行のレコード値を渡す
TextBox4.Text = i

If TextBox4.Text <> Nothing Then

frm変更画面.TextBox1.Text = dr.Table.Rows(i)("フィールド1").ToString
frm変更画面.TextBox2.Text = dr.Table.Rows(i)("フィールド2").ToString
frm変更画面.TextBox3.Text = dr.Table.Rows(i)("フィールド3").ToString

frm申請変更.Show()

End If
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2004-12-20 13:46
BindingManagerBase.Current は現在のデータ項目なので、
引用:

Dim dr As DataRow = CType(bmb.Current, DataRowView).Row

でいいんじゃないでしょうか。
Os_
ベテラン
会議室デビュー日: 2003/04/16
投稿数: 77
投稿日時: 2004-12-20 14:12
Osです。
説明不足で誤解を与えたかもしれませんが、
にしざきさんも書かれているように、

Dim dr as DataRow = CType(bmb.Current,DataRowView).Row

で、DataGridのカレントレコードを表しています。
したがって、下記のように設定することで特定のフィールドの値を取得できます。

frm変更画面.TextBox1.Text = dr("フィールド1").ToString
frm変更画面.TextBox2.Text = dr("フィールド2").ToString
frm変更画面.TextBox3.Text = dr("フィールド3").ToString

尚、dr.Table.Rows(i)と書くと、DataViewの場合と同様に元のDataTableを参照する
ことになります。

修正:DataView → DataRowView

[ メッセージ編集済み 編集者: Os_ 編集日時 2004-12-20 15:17 ]
co.jp
常連さん
会議室デビュー日: 2004/03/19
投稿数: 20
投稿日時: 2004-12-20 14:48
Os_さん、にしざきさんどうも有難うございます。
Os_さんがご心配された、フィールド値の取得についてはなんとか自力できました。
ついては、意図したコードが完成しました。
お忙しい所、お時間を割いて私に付き合って頂き、誠にありがとうございました。

最終的なコード
_______________________________________________________________________________

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
Dim frm変更画面 As New 変更画面
Dim i As Integer
Dim bmb As BindingManagerBase = DataGrid1.BindingContext(DataGrid1.DataSource, DataGrid1.DataMember)
Dim dr As DataRow = CType(bmb.Current, DataRowView).Row

'カーソル行のレコード値を渡す
TextBox4.Text = i

If TextBox4.Text <> Nothing Then

frm申請変更.TextBox1.Text = dr.Item("フィールド1").ToString
frm申請変更.TextBox2.Text = dr.Item("フィールド2")
frm申請変更.TextBox3.Text = dr.Item("フィールド3").ToString
frm申請変更.Show()

End If

End Sub
1

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