質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

4回答

10803閲覧

【VB.NET】子フォームから親フォームのデータグリッドの操作について

f-hanako

総合スコア159

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

2クリップ

投稿2017/05/11 07:37

編集2017/05/15 10:06

現在、MDBからレコードを読み込み、
データグリッド・フォームに内容を表示させるアプリを作成しています。

■前提

下記のような親・子フォームが存在します。
【親フォーム】
・データグリッドにレコードの一覧を表示。
・子フォームを開く際、IDを引き渡している。

【子フォーム】
・レコードの詳細を表示。
・プロパティでIDを取得。
・フォームを開く際にIDをキーに、MDBからレコードを読み込む。

イメージ説明

子フォームにあるボタンを押すことで、
親フォームにあるデータグリッドのフォーカスを移動したいと考えております。
また子フォームのデータも、親フォームのフォーカス移動に併せて
表示しなおすことを考えております。
(※画像参照)

■質問

(1)子フォームから親フォームのデータグリッドのフォーカス移動は可能でしょうか。
(2)子フォームの開きなおしをせずに、親フォームから新たにIDを取得し、レコードを読み込みなおすことは可能でしょうか。

以上、よろしくお願いします。

■開発環境

・作成アプリケーションの種類:Windowsフォーム
・開発環境:Windows7 64bit/Visual Studio Professional 2012 /.NET Framework 4.5

■修正コード1

VB.NET

1Public Class 親フォーム 2 3 Private Sub Button詳細_Click(sender As Object, e As EventArgs) Handles Button詳細.Click 4 Using 子フォーム As New 子フォーム 5 AddHandler 子フォーム.UpClick, AddressOf 子フォーム_UpClick 6 Dim _data as New DataStructure 7 '選択している行のデータを取得 8 _data.ID=.... 9 10 子フォーム.SetData( _data ) 11 子フォーム.ShowDialog(Me) 12 End Using 13 End Sub 14 15 Private Sub 子フォーム_UpClick(sender As Object, e As EventArgs) 16 With DataGridView1 17 '1行上を選択 18 '新たに選択した行のデータを取得 19 Dim _data as New DataStructure 20 _data.ID=.... 21 22 子フォーム.SetData( _data ) 23 End With 24 End Sub 25End Class 26 27 28Public Class 子フォーム 29 Private _ID As Integer 30 Public Property ID() As Integer 31 Get 32 Return _ID 33 End Get 34 Set(value As Integer) 35 _ID = value 36 End Set 37 End Property 38 39 Public Structure DataStructure 40 Dim ID As Integer 41 '............. 42 End Structure 43 44 Private Sub frmHitSyosai_Load(sender As Object, e As EventArgs) Handles MyBase.Load 45 display() 46 End Sub 47 48 Private sub display() 49 Dim strSql as String 50 'SQLを作成 51 strSql = "SELECT * FROM テーブル WHERE USRID = ID" 52 'OleDbDataReaderでレコード取得 53 54 '表示処理 55 lblID.text = ... 56 End Sub 57 58 Public Event UpClick(ByVal sender As Object, ByVal e As EventArgs) 59 60 '親フォームからデータを取得 61 Public Sub SetData(ByVal d As DataStructure) 62 '表示ロジック 63 display() 64 End Sub 65 66 '上をクリックした旨のイベントを発行 67 Private Sub ButtonUp_Click(sender As Object, e As EventArgs) Handles ButtonUp.Click 68 RaiseEvent UpClick(Me, New EventArgs) 69 End Sub 70 71End Class

■修正コード2

VB.NET

1Public Class 子フォーム 2 Private _ID As Integer 3 Public Property ID() As Integer 4 Get 5 Return _ID 6 End Get 7 Set(value As Integer) 8 _ID = value 9 End Set 10 End Property 11 12 Public Structure DataStructure 13 Dim ID As Integer 14 '............. 15 End Structure 16 17 Private Sub frmHitSyosai_Load(sender As Object, e As EventArgs) Handles MyBase.Load 18 display() 19 End Sub 20 21 Private sub display() 22 Dim strSql as String 23 'SQLを作成 24 strSql = "SELECT * FROM テーブル WHERE USRID = ID" 25 'OleDbDataReaderでレコード取得 26 27 '表示処理 28 lblID.text = ID 29 Debug.Print(ID) 30 '............. 31 Me.Refresh() 32 33 End Sub 34 35 '親フォームからデータを取得 36 Public Sub SetData(ByVal d As DataStructure) 37 '表示ロジック 38 display() 39 End Sub 40 41 Private Sub ButtonUp_Click(sender As Object, e As EventArgs) Handles ButtonUp.Click 42 Dim frm As New 親フォーム 43 frm = CType(Me.Owner, 親フォーム) 44 frm.子フォーム_UpClick(sender, e) 45 End Sub 46 47End Class 48

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/05/11 07:44

何を作っているか(Windows Forms? WPF? ASP.NET Web Forms? その他?)と自分の開発環境(開発マシンの OS, Visual Studio のバージョン・エディション、.NET のバージョンなど)は書けませんか?
f-hanako

2017/05/11 08:28

失礼いたしました。追記しましたので、お手数ですがご確認お願いします。
guest

回答4

0

ベストアンサー

実際に動くコードを貼り付けます。
細かいエラーは考慮していません。
また、前回の回答では、深く考えずに、Usingを用いていましたが、YAmaGNZ様のご指摘の通りですので、このあたりも含めて書き直しました。

VB.net

1Public Class Form1 '親フォーム 2 'フォーム上に、DataGridView1 3 'Form2起動用にButton1 4 'を配置 5 Private _frm2 As Form2 6 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 7 'DBから表を取得(ここでは、ソースで) 8 Dim tbl As DataTable = New DataTable("table1") 9 tbl.Columns.Add("ID") 10 tbl.Columns.Add("NAME") 11 tbl.Columns.Add("AGE") 12 Dim row As DataRow 13 row = tbl.NewRow() 14 row("ID") = "1" 15 row("NAME") = "TARO" 16 row("AGE") = "30" 17 tbl.Rows.Add(row) 18 row = tbl.NewRow() 19 row("ID") = "2" 20 row("NAME") = "HANAKO" 21 row("AGE") = "25" 22 tbl.Rows.Add(row) 23 row = tbl.NewRow() 24 row("ID") = "3" 25 row("NAME") = "JIRO" 26 row("AGE") = "20" 27 tbl.Rows.Add(row) 28 With DataGridView1 29 .DataSource = tbl 30 .SelectionMode = DataGridViewSelectionMode.FullRowSelect 31 .MultiSelect = False 32 .Rows(0).Selected = True 33 .AllowUserToAddRows = False 34 End With 35 End Sub 36 Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click 37 If _frm2 Is Nothing OrElse _frm2.IsDisposed Then 38 _frm2 = New Form2 39 End If 40 AddHandler _frm2.UpClick, AddressOf 子フォーム_UpClick 41 AddHandler _frm2.DwClick, AddressOf 子フォーム_dwClick 42 _frm2.ShowDialog(Me) 43 End Sub 44 Private Sub 子フォーム_UpClick(sender As Object, e As EventArgs) 45 With DataGridView1 46 '上の行番号を算出。最上位に行った場合は最下位にする。 47 Dim r As Integer = .SelectedCells(0).RowIndex 48 r = r - 1 49 If r < 0 Then 50 r = .Rows.Count - 1 51 End If 52 selectR(r) 53 End With 54 End Sub 55 Private Sub 子フォーム_dwClick(sender As Object, e As EventArgs) 56 With DataGridView1 57 '下の行番号を算出。最下位に行った場合は最上位にする。 58 Dim r As Integer = .SelectedCells(0).RowIndex 59 r = r + 1 60 If r > .Rows.Count - 1 Then 61 r = 0 62 End If 63 selectR(r) 64 End With 65 End Sub 66 Private Sub selectR(ByVal r As Integer) 67 With DataGridView1 68 '指定された行を選択 69 .Rows(r).Selected = True 70 '指定された行の値を取得し、form2に送る 71 Dim _data As New Form2.DataStructure 72 _data.ID = CInt(.Rows(r).Cells("ID").Value) 73 _data.name = .Rows(r).Cells("NAME").Value.ToString 74 _data.age = CInt(.Rows(r).Cells("AGE").Value) 75 _frm2.SetData(_data) 76 End With 77 End Sub 78End Class 79

vb.net

1Public Class Form2 2 'フォーム上に、「上」用Button1、「下」用Button2 3 '表示用にlblID,lblNamem,lblAge 4 'を配置 5 Public Event UpClick(ByVal sender As Object, ByVal e As EventArgs) 6 Public Event DwClick(ByVal sender As Object, ByVal e As EventArgs) 7 Public Structure DataStructure 8 Dim ID As Integer 9 Dim name As String 10 Dim age As Integer 11 End Structure 12 Public Sub SetData(ByVal data As DataStructure) 13 lblID.Text = data.ID.ToString 14 lblName.Text = data.name 15 lblAge.Text = data.age.ToString 16 End Sub 17 18 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 19 RaiseEvent UpClick(Me, New EventArgs) 20 End Sub 21 22 Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 23 RaiseEvent DwClick(Me, New EventArgs) 24 End Sub 25End Class

投稿2017/05/15 12:41

satou

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

f-hanako

2017/05/16 00:04

回答ありがとうございます。 実際に動くコードまでありがとうございます。 理解しやすく、無事目標の動きを作成することができました。 今回、ベストアンサーとさせていただきます。 ありがとうございました。
guest

0

VB.NET

1Public Class 親フォーム 2 3 Private Sub Button詳細_Click(sender As Object, e As EventArgs) Handles Button詳細.Click 4 Using 子フォーム As New 子フォーム '------1 5 AddHandler 子フォーム.UpClick, AddressOf 子フォーム_UpClick 6 7 8 End Using 9 End Sub 10 11 Private Sub 子フォーム_UpClick(sender As Object, e As EventArgs) 12 With DataGridView1 13 '1行上を選択 14 15 16 子フォーム.SetData( _data ) '------2 17 End With 18 End Sub 19End Class

上記の1の「子フォーム」と、2の「子フォーム」が別インスタンスになっています。

こういう場合は

VB.NET

1 Private WithEvents 詳細 As New 子フォーム 2 3 Private Sub Button詳細_Click(sender As Object, e As EventArgs) Handles Button詳細.Click 4 Dim _data as New DataStructure 5 '選択している行のデータを取得 6 _data.ID=.... 7 8 詳細.SetData( _data ) 9 詳細.ShowDialog(Me) 10 11 End Sub 12 13 Private Sub 子フォーム_UpClick(sender As Object, e As EventArgs) Handles 詳細.UpClick 14 With DataGridView1 15 '1行上を選択 16 '新たに選択した行のデータを取得 17 Dim _data as New DataStructure 18 _data.ID=.... 19 20 詳細.SetData( _data ) 21 End With 22 End Sub

という感じでUsingを使用せずに書くべきだと個人的には思います。

もし、Usingを使用するのであれば

VB.NET

1 Private Sub 子フォーム_UpClick(sender As Object, e As EventArgs) 2 With DataGridView1 3 '1行上を選択 4 '新たに選択した行のデータを取得 5 Dim _data as New DataStructure 6 _data.ID=.... 7 8 DirectCast(sender, 子フォーム).SetData( _data ) 9 End With

と、新たにインスタンスを生成しない書き方をすべきです。

投稿2017/05/15 12:09

YAmaGNZ

総合スコア10242

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

f-hanako

2017/05/15 23:59

ありがとうございます。 インスタンスやUsingの使い方について、理解せずに作成していました…。 今回のご指摘を受けて改めて勉強したいと思います。
guest

0

子フォームを「修正コード2」のように修正したところ、
子フォームから親フォームのデータグリッドを操作できるようになりました。

しかし、子フォームの表示が更新されません。
IDの引き渡し等はきちんとできていることは確認しています。
フォームの更新後にRefresh()も入れているのですが、更新されませんでした。

他に描画の更新方法はありますか。こちらも合わせてご指摘いただければ幸いです。

投稿2017/05/15 10:09

f-hanako

総合スコア159

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

参考となるURLは
別のフォームのデータを取得、設定する
があります。

同じ立場になった場合、個人的には、コードが長くなりますが、以下のような感じで作成すると思います。

Public Class 親フォーム Private Sub Button詳細_Click(sender As Object, e As EventArgs) Handles Button詳細.Click Using 子フォーム As New 子フォーム AddHandler 子フォーム.UpClick, AddressOf 子フォーム_UpClick 子フォーム.ShowDialog(Me) End Using End Sub Private Sub 子フォーム_UpClick(sender As Object, e As EventArgs) With DataGridView1 '1行上を選択 '新たに選択した行のデータを取得 Dim _data as New DataStructure _data.ID=.... 子フォーム.SetData( _data ) End With End Sub End Class Public Class 子フォーム Public Event UpClick(ByVal sender As Object, ByVal e As EventArgs) '親フォームからデータを取得 Public Sub SetData(ByVal d As DataStructure) label_id.text=d.ID '......表示 End Sub '上をクリックした旨のイベントを発行 Private Sub ButtonUp_Click(sender As Object, e As EventArgs) Handles ButtonUp.Click RaiseEvent UpClick(Me, New EventArgs) End Sub Public Structure DataStructure Dim ID As Integer '............. End Structure End Class

投稿2017/05/11 10:15

編集2017/05/11 10:38
satou

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

f-hanako

2017/05/15 09:54

回答ありがとうございます。 satouさんに提示していただいたコードを参考に修正してみたのですが、 親フォームのイベントを呼び出せませんでした。 いくつかサイトを調べてみたのですが、どこがおかしいのか見当がつきません…。 追記したコードで気になった個所がありましたら、ご指摘お願いできませんか。 よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問