星期五, 3月 04, 2016

[RV] 使用 WinForms ReportViewer 控制項

網路上找到這篇文章 Using ReportViewer control in Windows Forms (WinForms) Application using C# and VB.Net,覺得有幫助就拿來練習,資料抓 AdventureWorks2014 內的員工資料

建立 DataSet

新增資料集:Employee.xsd

[RV] 使用 WinForms ReportViewer 控制項-1

在 Employee.xsd 內新增 DataTable:dtEmploy,並建立 DataColumn

[RV] 使用 WinForms ReportViewer 控制項-2

HireDate 和 BirthDate 的 DataType 要改為 System.DateTime,預設為 System.String

[RV] 使用 WinForms ReportViewer 控制項-3

完成後就可以在資料來源視窗內看見該 DataSet

[RV] 使用 WinForms ReportViewer 控制項-4


建立報表

利用報表精靈建立 ReportByCode.rdlc 報表

[RV] 使用 WinForms ReportViewer 控制項-5

名稱:dsEmploy
資料來源:選擇剛剛建立的 Employee DataSet
可用資料集:Employee.xsd 內的 dtEmploy DataTable

[RV] 使用 WinForms ReportViewer 控制項-6

把全部欄位都拖曳到值的位置

[RV] 使用 WinForms ReportViewer 控制項-7

練習用,沒有群組和彙總需求

[RV] 使用 WinForms ReportViewer 控制項-8

選擇樣式

[RV] 使用 WinForms ReportViewer 控制項-9

ReportByCode 報表配置

[RV] 使用 WinForms ReportViewer 控制項-10

從報表資料視窗內可以看見剛剛的設定

[RV] 使用 WinForms ReportViewer 控制項-11


ReportViewer 控件

拖曳一個 ReportViewer 控件進入 Form 中,並選擇報表

[RV] 使用 WinForms ReportViewer 控制項-12

設定資料來源

從 AdventureWorks2014 內抓取資料,並塞到 ReportViewer 內
CREATE PROCEDURE GetEmployData
AS
    SELECT
        E.BusinessEntityID ,
        P.LastName ,
        P.FirstName ,
        E.JobTitle ,
        E.Birthdate ,
        E.HireDate
    FROM [HumanResources].[Employee] AS E
        JOIN Person.Person AS P ON E.BusinessEntityID = P.BusinessEntityID
using Microsoft.Reporting.WinForms;
using System.Data.SqlClient;

namespace RVByCode
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Employee dsEmploy = GetEmployData();
            ReportDataSource datasource = new ReportDataSource("dsEmploy", dsEmploy.Tables[0]);
            this.reportViewer1.LocalReport.DataSources.Clear();
            this.reportViewer1.LocalReport.DataSources.Add(datasource);
            this.reportViewer1.RefreshReport();
        }

        private Employee GetEmployData()
        {
            string ConnectionString = @"Data Source=.\Sql2014;Initial Catalog=AdventureWorks2014;Integrated Security = true";

            using (SqlConnection con = new SqlConnection(ConnectionString))
            {
                try
                {
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = con;
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.CommandText = "GetEmployData";
                    SqlDataAdapter da = new SqlDataAdapter(cmd);
                    Employee dsEmploy = new Employee();

                    da.Fill(dsEmploy, "dtEmploy");

                    return dsEmploy;
                }
                catch (Exception)
                {
                    throw;
                }
            }
        }
    }
}

檢視設定成果

[RV] 使用 WinForms ReportViewer 控制項-13

ReportDataSource

只要是 DataSet 都一律用 ds 來當成開頭,沒想到執行時,還是有錯誤發生,錯誤訊息:尚未提供資料來源 'dsEmploy' 的資料來源執行個體

[RV] 使用 WinForms ReportViewer 控制項-14

後來才發現是設定報表時,指定資料集名稱為 dsEmploy,ReportDataSource 的第一個參數要跟報表 DataSet 一模一樣才行

ReportDataSource datasource = new ReportDataSource("sourceEmploy", dsEmploy.Tables[0]);
// 改為
ReportDataSource datasource = new ReportDataSource("dsEmploy", dsEmploy.Tables[0]);

沒有留言:

張貼留言