none
フォーム内のデータソースからReportViewerのデータソースへデータの受け渡し RRS feed

  • 質問

  • 環境: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明細]に受け渡し、レポートビューワのデータソースと
    することは可能でしょうか?もし可能でしたら、その方法を
    ご教示の程よろしくお願い申し上げます。

    2015年1月9日 9:10

回答

  • レポートにパラメータとして値を渡せます

    1. メニュー->表示->レポートデータでレポートウィンドウを表示。
    2. 一覧のパラメーターを右クリックしてパラメーターの追加。
    3. 名前に適当な名前を付ける。データ型はテキストのままで。
      長さ0の文字列を設定する可能性がある場合は空白やnullを許可に。
    4. 追加されたパラメーターをレポートデザイナ上のテキストボックスまで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
    2015年1月13日 10:09
  • 以下で出来ると思いますが、

    1. New frmKyuyoMeisaiとShowDialogの間にdvを渡す
    2. dv.ToTableでDataTableを取得する
    3. ReportViewer1.LocalReport.DataSourceに渡す

    問題点を読み取れてないかもしれません。。。

    • 回答としてマーク kei_chan_gt 2015年1月13日 9:10
    2015年1月9日 9:53
    モデレータ
  • こんな

    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
    2015年1月9日 10:49

すべての返信

  • 以下で出来ると思いますが、

    1. New frmKyuyoMeisaiとShowDialogの間にdvを渡す
    2. dv.ToTableでDataTableを取得する
    3. ReportViewer1.LocalReport.DataSourceに渡す

    問題点を読み取れてないかもしれません。。。

    • 回答としてマーク kei_chan_gt 2015年1月13日 9:10
    2015年1月9日 9:53
    モデレータ
  • こんな

    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
    2015年1月9日 10:49
  • Tak1wa 様
    gekka 様

    お忙しい中、ご教示いただき大変に感謝申し上げます。
    gekka 様よりご教示いただきましたコードで無事、
    ReportViewer1 のデータソースに dv を指定することができました。

    そしてまた新たな問題が出てまいりました。
    重ね重ね恐縮ではございますがご教示いただければ幸いです。

    給与の検索期間を設定するフォーム[frm給与] には、
    職員名を表示するテキストボックス[txt職員名]があります。
    そのデータソースである dv の中には[職員コード]のみが記録されており
    職員名は入っていません。

    前述でご質問し、ご教示をいただいた、ReportViewew1のデータソースに、
    [frm給与]のデータソース dv を受け渡すと同時に、ReportViewer1 の
    ページヘッダーに貼りつけた、テキストボックス[rpt職員名]に対して、
    [frm給与]の[txt職員名]の値を代入することはできませんでしょうか?

    dvの中に職員名のデータを入れれば事は済むのでしょうが、同じ内容を
    繰り返すデータを dv の中に入れたくないものですから。

    何卒よろしくお願い申し上げます。

    2015年1月13日 9:27
  • レポートにパラメータとして値を渡せます

    1. メニュー->表示->レポートデータでレポートウィンドウを表示。
    2. 一覧のパラメーターを右クリックしてパラメーターの追加。
    3. 名前に適当な名前を付ける。データ型はテキストのままで。
      長さ0の文字列を設定する可能性がある場合は空白やnullを許可に。
    4. 追加されたパラメーターをレポートデザイナ上のテキストボックスまで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
    2015年1月13日 10:09
  • gekka 様

    おはようございます。
    お返事が遅くなりまして申し訳ございません。

    ご教示いただきました内容で、無事レポートビューワーへ
    DataView のデータの受け渡し、ならびにパラメータへ
    テキストボックスのデータの受け渡しを行うことが出来ました。

    ご教示いただけなければレポートを完成させることは
    できませんでした。

    また何かございましたら、どうかご教示の程
    よろしくお願い申し上げます。

    ありがとうございました。

    2015年1月20日 23:54