ReportViewerへのデータを挿入する場合Datatableを介する場合が一般的です。
私は、データベースへの接続をEntityFrameworkで行っています。
その場合はdatatableではなくdatabindingを使用します。
その方法を紹介します。
開発環境
OS:Windows10 64bit Home
開発環境:VisualStudio2019
プログラム言語:C# (.Net)
EntifyFramework:6.2
手順
EntityFrameworkにてDbCotextとModelが追加されていることを前提とします。
①FormにReportViewerをドラッグする
②データソースにEntityFrameworkで追加したオブジェクトを追加する
オブジェクトを選択する
レポートに表示させてたいオブジェクトを選択する
私の場合は、Customerテーブル
※ここにオブジェクト(Customer)が表示されていない場合は、いったんプロジェクトのビルドを行う必要があります。
オブジェクトが設定されているのが確認できるかと思います。
③レポートウィザードを実行する
「新しい項目の追加」から「レポートウィザード」を追加する
データソースとデータセットを選択する
このコンボボックスでオブジェクトが表示されない場合、②のデータソースの設定がうまくいっていない可能性があります。
値のテキストボックスにすべての列をドラッグする
赤枠をクリックしてドロップダウンを表示させる
【重要】
一旦SUMを選択して、再度プルダウンメニューを開きSUMをクリックする
一部自動的に集計項目(SUM、AVEなど)になっているのを解除するためにすべてSUMをONにしたあとにOFFにしています。
この作業をしないとレポートには集計値が表示される可能性があります。
レポートの追加が確認できた
④Form_Loadにコードを追加する
ここでは、
- データベースからデータを引っ張る
- レポートにデータを設定する
を行います。
レポートを貼り付けたFormの上の部分をダブルクリックする
以下ソースを貼り付ける
貼り付ける場所は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 sender, EventArgs 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(); } } }