トップ回答者
フォーム内のデータソースからReportViewerのデータソースへデータの受け渡し

質問
-
環境:2013 Pro
いつもお世話になっております。
フォーム内にてコードでDataView(dvと呼びます。)を作成し、
そのdvのデータをOwnerにて、ReportViewerに渡すことは
可能でしょうか?=詳細=
1.[frm給与]において、コードにて、モジュールレベルの宣言領域に
Public dv as NEW DataView(dt)
を記述し、フィルタリングしたデータを入れてあります。2.次に[frm明細]を作成し、その中に[ReportViewer1]を貼り付け、
ReportViewer1の「レポートの選択」ボックスには、あらかじめ作成して
おいた[rpt明細top.rdlc]を指定してあります。3.[frm給与]の中にあるボタンへ、
Dim frm給与明細 As New frmKyuyoMeisai
frm給与明細.ShowDialog(Me)
と記述しました。この状態に置いて[frm給与]にて作成した[dv]のデータを
[frm明細]に受け渡し、レポートビューワのデータソースと
することは可能でしょうか?もし可能でしたら、その方法を
ご教示の程よろしくお願い申し上げます。
回答
-
レポートにパラメータとして値を渡せます
- メニュー->表示->レポートデータでレポートウィンドウを表示。
- 一覧のパラメーターを右クリックしてパラメーターの追加。
- 名前に適当な名前を付ける。データ型はテキストのままで。
長さ0の文字列を設定する可能性がある場合は空白やnullを許可に。 - 追加されたパラメーターをレポートデザイナ上のテキストボックスまでD&Dする。
あとはデータソースの場合と同じようにfrm明細に職員名を渡し、パラメータとしてLocalReportに設定します。
Imports Microsoft.Reporting.WinForms Public Class frm明細 Private _ReportData As DataView Private _職員名 As String = String.Empty Public Property ReportData As DataView Get Return _ReportData End Get Set(value As DataView) _ReportData = value ReportUpdate() End Set End Property Public Property 職員名 As String Get Return _職員名 End Get Set(value As String) _職員名 = value ReportUpdate() End Set End Property Private Sub frm明細_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ReportUpdate() End Sub Private Sub ReportUpdate() Dim viewer As ReportViewer = Me.ReportViewer1 Dim report As LocalReport = viewer.LocalReport For Each name As String In report.GetDataSourceNames() 'レポートで定義したデータセット名があるか調べる 'あらかじめ判っているなら列挙してチェックする必要なし '逆にデータセット名がわかってない場合はこれでデータ名を調べてデータを渡します If (name = "レポートのデータセット名") Then 'データの名前を指定して、dvを渡す 'DataTableでレポートを作っていても列名が一致していれば取り出せるので 'DataViewのままでOK Dim source As New ReportDataSource("レポートのデータセット名") source.Value = Me.ReportData report.DataSources.Add(source) End If Next 'パラメーター名指定してパラメーター値を設定できます For Each info As ReportParameterInfo In report.GetParameters() If (info.Name = "パラメーター名") Then report.SetParameters(New ReportParameter("パラメーター名", _職員名)) End If Next Me.ReportViewer1.RefreshReport() End Sub End Class Public Class frm給与 Public dv As New DataView 'グローバルの代用 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click '(省略) Dim frm給与明細 As New frm明細 frm給与明細.ReportData = dv '明細フォームで表示するデータを渡す frm給与明細.職員名 = txt職員名.Text '値を渡すコードを追加 frm給与明細.ShowDialog(Me) End Sub End Class
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答としてマーク kei_chan_gt 2015年1月20日 23:42
-
以下で出来ると思いますが、
- New frmKyuyoMeisaiとShowDialogの間にdvを渡す
- dv.ToTableでDataTableを取得する
- ReportViewer1.LocalReport.DataSourceに渡す
問題点を読み取れてないかもしれません。。。
- 回答としてマーク kei_chan_gt 2015年1月13日 9:10
-
こんな
Public Class frm給与 Public dv As New DataView 'モジュールレベルの代用 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click '適当にテスト用のデータを作ってみる Dim dt As New DataTable dt.Columns.Add(New DataColumn("データセットのフィールド名", GetType(Integer))) For i As Integer = 0 To 100 Dim row As DataRow = dt.NewRow() row(0) = i dt.Rows.Add(row) Next dv = New DataView(dt) dv.Sort = "データセットのフィールド名" dv.RowFilter = "データセットのフィールド名 > 50" Dim frm給与明細 As New frm明細 frm給与明細.ReportData = dv '明細フォームで表示するデータを渡す frm給与明細.ShowDialog(Me) End Sub End Class
Imports Microsoft.Reporting.WinForms Public Class frm明細 Private _ReportData As DataView Public Property ReportData As DataView Get Return _ReportData End Get Set(value As DataView) _ReportData = value End Set End Property Private Sub frm明細_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim viewer As ReportViewer = Me.ReportViewer1 Dim report As LocalReport = viewer.LocalReport For Each name As String In report.GetDataSourceNames() 'レポートで定義したデータセット名があるか調べる 'あらかじめ判っているなら列挙してチェックする必要なし '逆にデータセット名がわかってない場合はこれでデータ名を調べてデータを渡します If (name = "レポートのデータセット名") Then 'データの名前を指定して、dvを渡す 'DataTableでレポートを作っていても列名が一致していれば取り出せるので 'DataViewのままでOK Dim source As New ReportDataSource("レポートのデータセット名") source.Value = Me.ReportData report.DataSources.Add(source) End If Next Me.ReportViewer1.RefreshReport() 'レポートの表示を更新 End Sub End Class
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 編集済み gekkaMVP 2015年1月9日 10:49
- 回答としてマーク kei_chan_gt 2015年1月13日 9:10
すべての返信
-
以下で出来ると思いますが、
- New frmKyuyoMeisaiとShowDialogの間にdvを渡す
- dv.ToTableでDataTableを取得する
- ReportViewer1.LocalReport.DataSourceに渡す
問題点を読み取れてないかもしれません。。。
- 回答としてマーク kei_chan_gt 2015年1月13日 9:10
-
こんな
Public Class frm給与 Public dv As New DataView 'モジュールレベルの代用 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click '適当にテスト用のデータを作ってみる Dim dt As New DataTable dt.Columns.Add(New DataColumn("データセットのフィールド名", GetType(Integer))) For i As Integer = 0 To 100 Dim row As DataRow = dt.NewRow() row(0) = i dt.Rows.Add(row) Next dv = New DataView(dt) dv.Sort = "データセットのフィールド名" dv.RowFilter = "データセットのフィールド名 > 50" Dim frm給与明細 As New frm明細 frm給与明細.ReportData = dv '明細フォームで表示するデータを渡す frm給与明細.ShowDialog(Me) End Sub End Class
Imports Microsoft.Reporting.WinForms Public Class frm明細 Private _ReportData As DataView Public Property ReportData As DataView Get Return _ReportData End Get Set(value As DataView) _ReportData = value End Set End Property Private Sub frm明細_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim viewer As ReportViewer = Me.ReportViewer1 Dim report As LocalReport = viewer.LocalReport For Each name As String In report.GetDataSourceNames() 'レポートで定義したデータセット名があるか調べる 'あらかじめ判っているなら列挙してチェックする必要なし '逆にデータセット名がわかってない場合はこれでデータ名を調べてデータを渡します If (name = "レポートのデータセット名") Then 'データの名前を指定して、dvを渡す 'DataTableでレポートを作っていても列名が一致していれば取り出せるので 'DataViewのままでOK Dim source As New ReportDataSource("レポートのデータセット名") source.Value = Me.ReportData report.DataSources.Add(source) End If Next Me.ReportViewer1.RefreshReport() 'レポートの表示を更新 End Sub End Class
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 編集済み gekkaMVP 2015年1月9日 10:49
- 回答としてマーク kei_chan_gt 2015年1月13日 9:10
-
Tak1wa 様
gekka 様お忙しい中、ご教示いただき大変に感謝申し上げます。
gekka 様よりご教示いただきましたコードで無事、
ReportViewer1 のデータソースに dv を指定することができました。そしてまた新たな問題が出てまいりました。
重ね重ね恐縮ではございますがご教示いただければ幸いです。給与の検索期間を設定するフォーム[frm給与] には、
職員名を表示するテキストボックス[txt職員名]があります。
そのデータソースである dv の中には[職員コード]のみが記録されており
職員名は入っていません。前述でご質問し、ご教示をいただいた、ReportViewew1のデータソースに、
[frm給与]のデータソース dv を受け渡すと同時に、ReportViewer1 の
ページヘッダーに貼りつけた、テキストボックス[rpt職員名]に対して、
[frm給与]の[txt職員名]の値を代入することはできませんでしょうか?dvの中に職員名のデータを入れれば事は済むのでしょうが、同じ内容を
繰り返すデータを dv の中に入れたくないものですから。何卒よろしくお願い申し上げます。
-
レポートにパラメータとして値を渡せます
- メニュー->表示->レポートデータでレポートウィンドウを表示。
- 一覧のパラメーターを右クリックしてパラメーターの追加。
- 名前に適当な名前を付ける。データ型はテキストのままで。
長さ0の文字列を設定する可能性がある場合は空白やnullを許可に。 - 追加されたパラメーターをレポートデザイナ上のテキストボックスまでD&Dする。
あとはデータソースの場合と同じようにfrm明細に職員名を渡し、パラメータとしてLocalReportに設定します。
Imports Microsoft.Reporting.WinForms Public Class frm明細 Private _ReportData As DataView Private _職員名 As String = String.Empty Public Property ReportData As DataView Get Return _ReportData End Get Set(value As DataView) _ReportData = value ReportUpdate() End Set End Property Public Property 職員名 As String Get Return _職員名 End Get Set(value As String) _職員名 = value ReportUpdate() End Set End Property Private Sub frm明細_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ReportUpdate() End Sub Private Sub ReportUpdate() Dim viewer As ReportViewer = Me.ReportViewer1 Dim report As LocalReport = viewer.LocalReport For Each name As String In report.GetDataSourceNames() 'レポートで定義したデータセット名があるか調べる 'あらかじめ判っているなら列挙してチェックする必要なし '逆にデータセット名がわかってない場合はこれでデータ名を調べてデータを渡します If (name = "レポートのデータセット名") Then 'データの名前を指定して、dvを渡す 'DataTableでレポートを作っていても列名が一致していれば取り出せるので 'DataViewのままでOK Dim source As New ReportDataSource("レポートのデータセット名") source.Value = Me.ReportData report.DataSources.Add(source) End If Next 'パラメーター名指定してパラメーター値を設定できます For Each info As ReportParameterInfo In report.GetParameters() If (info.Name = "パラメーター名") Then report.SetParameters(New ReportParameter("パラメーター名", _職員名)) End If Next Me.ReportViewer1.RefreshReport() End Sub End Class Public Class frm給与 Public dv As New DataView 'グローバルの代用 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click '(省略) Dim frm給与明細 As New frm明細 frm給与明細.ReportData = dv '明細フォームで表示するデータを渡す frm給与明細.職員名 = txt職員名.Text '値を渡すコードを追加 frm給与明細.ShowDialog(Me) End Sub End Class
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答としてマーク kei_chan_gt 2015年1月20日 23:42