ボス級社内SEのお役立ち技術情報

社内SEのシステム開発について。メインプログラム言語C#

EntityFrameworkを使用してReportViewerにデータを代入する

f:id:HLSE:20190414135344j:plain

 

ReportViewerへのデータを挿入する場合Datatableを介する場合が一般的です。

私は、データベースへの接続をEntityFrameworkで行っています。

その場合はdatatableではなくdatabindingを使用します。

 

その方法を紹介します。

 

開発環境

OS:Windows10 64bit Home
開発環境:VisualStudio2019
プログラム言語:C# (.Net)

EntifyFramework:6.2

 

手順

EntityFrameworkにてDbCotextとModelが追加されていることを前提とします。

①FormにReportViewerをドラッグする

f:id:HLSE:20190901101102j:plain

②データソースにEntityFrameworkで追加したオブジェクトを追加する

f:id:HLSE:20190901122441j:plain

オブジェクトを選択する

f:id:HLSE:20190901122445j:plain

レポートに表示させてたいオブジェクトを選択する

私の場合は、Customerテーブル

※ここにオブジェクト(Customer)が表示されていない場合は、いったんプロジェクトのビルドを行う必要があります。

f:id:HLSE:20190901122449j:plain

オブジェクトが設定されているのが確認できるかと思います。

f:id:HLSE:20190901122452j:plain

③レポートウィザードを実行する

「新しい項目の追加」から「レポートウィザード」を追加する

f:id:HLSE:20190901123550j:plain

データソースとデータセットを選択する

このコンボボックスでオブジェクトが表示されない場合、②のデータソースの設定がうまくいっていない可能性があります。

f:id:HLSE:20190901123555j:plain

値のテキストボックスにすべての列をドラッグする

f:id:HLSE:20190901123559j:plain

赤枠をクリックしてドロップダウンを表示させる

f:id:HLSE:20190901123604j:plain

【重要】

一旦SUMを選択して、再度プルダウンメニューを開きSUMをクリックする

一部自動的に集計項目(SUM、AVEなど)になっているのを解除するためにすべてSUMをONにしたあとにOFFにしています。

この作業をしないとレポートには集計値が表示される可能性があります。

 

f:id:HLSE:20190901123608j:plain

レポートの追加が確認できた

f:id:HLSE:20190901124406j:plain

④Form_Loadにコードを追加する

ここでは、

  • データベースからデータを引っ張る
  • レポートにデータを設定する

を行います。

 

レポートを貼り付けたFormの上の部分をダブルクリックする

f:id:HLSE:20190901125931j:plain

 

以下ソースを貼り付ける

貼り付ける場所はForm_loadないの箇所

using Microsoft.Reporting.WinForms;
using System;
using System.Data.Entity.Validation;
using System.Linq;
using System.Windows.Forms;
 
namespace ReportViwerTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object senderEventArgs e)
        {
            var bs = new BindingSource();
            ////////////////////////////////////////////////////////////////////////////////
            //データベースからデータを取得する
            ////////////////////////////////////////////////////////////////////////////////
            using (var db = new Model1())
            {
                try
                {
                    //データベースよりデータを100件取得する
                    var query = db.Customer.Take(100).ToList();
                    //バインディングソースにデータをセットする
                    bs.DataSource = query;
                }
                catch (DbEntityValidationException ex)
                {
                    var errorMessage = "";
                    ex.EntityValidationErrors.SelectMany(error => error.ValidationErrors).ToList()
                        .ForEach(model => errorMessage = errorMessage + model.PropertyName + " - " + model.ErrorMessage);
                    MessageBox.Show(errorMessage);
                }
            }
 
            ////////////////////////////////////////////////////////////////////////////////
            //レポートにデータを設定する
            ////////////////////////////////////////////////////////////////////////////////
            ReportDataSource rs = new ReportDataSource();
            rs.Name = "DataSet1";
            //BindingSourceを指定する。一般的にここはDataTable
            rs.Value = bs;
 
            reportViewer2.Reset();
            reportViewer2.ProcessingMode = ProcessingMode.Local;
            //作成したレポートをここで指定する
            reportViewer2.LocalReport.ReportPath = "Report1.rdlc";
            reportViewer2.LocalReport.DataSources.Add(rs);
            reportViewer2.RefreshReport();
        }
    }
}