社員ブログ
HOME  社員ブログ

.net修行中14

2013年02月19日 17時32分48秒



こんにちは、モンクです。


今回はフォームに配置したグリッドのデータを、レポートに出力してみました。


フォームからフォームへのデータの受け渡しは実績があるのですが、
レポートへはどう渡そうか考えました。


少しややこしいですが、
①:まずグリッドのデータをレポートのデータセット(クラス型のリスト)に、格納します。


②:次に①で作ったリストを、ReportViewerの張り付けてある印刷用のフォームに渡します。


③:印刷用のフォームのフォームロードで、①で作ったリストをデータソースにバインドします。


まとめるとこんな感じです。


■印刷用のデータを格納するデータセット(クラス)

<br />
'**********************************************************************<br />
'  リスト表示するための要素(明細)<br />
Public Class Product<br />
    Private m_name As String<br />
    Private m_price As Integer</p>
<p>    Public Sub New(name As String, price As Integer)<br />
        m_name = name<br />
        m_price = price<br />
    End Sub</p>
<p>    Public Property Name() As String<br />
        Get<br />
            Return m_name<br />
        End Get<br />
        Set(value As String)<br />
            m_name = value<br />
        End Set<br />
    End Property</p>
<p>    Public Property Price() As Integer<br />
        Get<br />
            Return m_price<br />
        End Get<br />
        Set(value As Integer)<br />
            m_price = value<br />
        End Set<br />
    End Property</p>
<p>End Class</p>
<p>'**********************************************************************<br />
'  Productクラスのリストを持つクラス<br />
Public Class Merchant<br />
    Private m_products As List(Of Product)</p>
<p>    Public Sub New(dataList As List(Of Product))<br />
        m_products = New List(Of Product)<br />
        m_products = dataList<br />
    End Sub</p>
<p>    Public Function GetProducts() As List(Of Product)<br />
        Return m_products<br />
    End Function</p>
<p>End Class<br />



■印刷元のデータを持っている画面
<br />
'**********************************************************************<br />
'  グリッドにデータを表示する画面(フォーム)<br />
Public Class DataForm<br />
    ' 印刷用フォームに渡すオブジェクトリスト<br />
    Private prtLst As List(Of Product)</p>
<p>    '  Formオブジェクトを保持するためのフィールド<br />
    Private Shared _DataFormInstance As DataForm</p>
<p>    '  Formオブジェクトを取得、設定するためのプロパティ<br />
    Public Shared Property DataFormInstance() As DataForm<br />
        Get<br />
            Return _DataFormInstance<br />
        End Get<br />
        Set(value As DataForm)<br />
            _DataFormInstance = value<br />
        End Set<br />
    End Property</p>
<p>    ' 印刷用リスト<br />
    Public Property PrintList As List(Of Product)<br />
        Get<br />
            Return _DataFormInstance.prtLst<br />
        End Get<br />
        Set(value As List(Of Product))<br />
            _DataFormInstance.prtLst = value<br />
        End Set<br />
    End Property</p>
<p>    '************************************************************<br />
    '  フォームロード<br />
    Private Sub DataForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load</p>
<p>        DataViewGrid1.Rows.Add()<br />
        DataViewGrid1.Rows(0).Cells(0).Value = &quot;Pen&quot;<br />
        DataViewGrid1.Rows(0).Cells(1).Value = 25</p>
<p>        DataViewGrid1.Rows.Add()<br />
        DataViewGrid1.Rows(1).Cells(0).Value = &quot;Pencil&quot;<br />
        DataViewGrid1.Rows(1).Cells(1).Value = 30</p>
<p>        DataViewGrid1.Rows.Add()<br />
        DataViewGrid1.Rows(2).Cells(0).Value = &quot;Notebook&quot;<br />
        DataViewGrid1.Rows(2).Cells(1).Value = 15</p>
<p>        ' データ受け渡し用にインスタンスに入れておく<br />
        DataForm.DataFormInstance = Me<br />
    End Sub<br />
    '************************************************************<br />
    '  印刷ボタン押したとき<br />
    Private Sub btnPrint_Click(sender As Object, e As EventArgs) Handles btnPrint.Click</p>
<p>        prtLst = New List(Of Product)</p>
<p>        For i As Integer = 0 To DataViewGrid1.RowCount - 1<br />
            prtLst.Add(New Product(DataViewGrid1.Rows(i).Cells(0).Value),DataViewGrid1.Rows(i).Cells(1).Value))<br />
        Next</p>
<p>        DataForm.DataFormInstance.PrintList = prtLst</p>
<p>        Dim f As PrintForm = New PrintForm</p>
<p>        f.ShowDialog(Me)</p>
<p>        f.Close()</p>
<p>    End Sub<br />
End Class<br />


■データの受け渡し先(印刷機能を持っている)画面
<br />
'**********************************************************************<br />
'  印刷画面(ReportViewerコントロールが貼ってあるフォーム)<br />
Public Class PrintForm</p>
<p>    Private mMerchant As Merchant '←Productクラスのリストを持つクラス</p>
<p>    Private Sub PrintForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load</p>
<p>        mMerchant = New Merchant(CType(Me.Owner, DataForm).PrintList)</p>
<p>        Me.PrintFormBindingSource.DataSource = mMerchant.GetProducts</p>
<p>        Me.ReportViewer1.RefreshReport()</p>
<p>    End Sub</p>
<p>End Class<br />


参考になりますでしょうか。
まだまだReportViewerの苦難は続きます。

.NET, VB.NET, 社員:モンク, 開発言語, 雑記

  1. コメントはまだありません
  1. トラックバックはまだありません