- - PR -
VB.NET DataGridでクリックされた行のデータを別のFormに渡したい
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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 | ||||
|
投稿日時: 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 ] | ||||
|
投稿日時: 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 | ||||
|
投稿日時: 2004-12-20 13:46
BindingManagerBase.Current は現在のデータ項目なので、
| ||||
|
投稿日時: 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 ] | ||||
|
投稿日時: 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