■94143 / inTopicNo.6) |
Re[5]: DataGridViewで選択した値を取得して別画面に表示し |
□投稿者/ 魔界の仮面弁士 (2622回)-(2020/03/19(Thu) 13:00:18)
|
■No94141 (あい さん) に返信 > DataGridView2で選択した行の値をDataGridView1に表示させたいだけなのですが、
Form2 をモーダルで開くのはどうですか?
わざわざ DataGridViewButtonColumn を設けたということは、 ・ボタンセルが押された行の情報を、Form2 側に渡したい ・Form2 の ButtonSel_Click で、Form2.DataGridView2 の内容を DataGridView1 に書き戻したい という状況を予想してみました。
【Form1 側】 Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick 'ボタン列がクリックされた時 If e.RowIndex >= 0 AndAlso TypeOf DataGridView1.Columns(e.ColumnIndex) Is DataGridViewButtonColumn Then 'その行を取得して Dim row = DataGridView1.Rows(e.RowIndex) ' Dim sourceRow As DataRow = DirectCast(row.DataBoundItem, DataRowView).Row '自作の共有メソッドに渡して、Form2 をモーダルダイアログとして開く Form2.ShowExampleDialog(Me, row) End If End Sub
【Form2 側】 Public Class Form2 Private parentRow As DataGridViewRow
Public Shared Sub ShowExampleDialog(owner As IWin32Window, parentRow As DataGridViewRow) Using f2 As New Form2() f2.parentRow = parentRow f2.ShowDialog(owner) End Using End Sub
Private Sub ButtonSel_Click(sender As Object, e As EventArgs) Handles ButtonSel.Click ' No39258 のソースは「選択行の先頭」を読み取ってましたが、 ' 下記は「現在行」を読み取るようにしています。 Dim row = Me.DataGridView2.CurrentRow If row Is Nothing OrElse parentRow Is Nothing Then MessageBox.Show(Me, "行が選択されていません") Else parentRow.Cells(0).Value = row.Cells(0).Value End If End Sub
Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'ここには DataGridView2 にデータを表示する処理などの '画面初期化処理が記述される End Sub End Class
上記では ShowDialog メソッドによる「モーダル」ダイアログですが、 もしも Show メソッドによる「モードレス」ダイアログとして Form2 を表示し、 しかも ButtonSel の動作が『ボタンセルが押された行』へ反映ではなく、 『DataGridView1 の選択行すべて』への反映とするのならば、
・Form2 に選択通知イベントを自作しておく ・Form2 の ButtonSel_Click で、選択した値を 選択通知イベントとして RaiseEvent する ・Form1 側は、子画面から選択通知をイベントして受け取った時に、 イベント引数で得た選択値を、自身の DataGridView1 に反映させる
という手法が使えるかと思います。
参考までに、自作イベントを用いたフォーム間のデータ送信例を貼っておきます。 http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=30458
|
|