Report Viewer là một công cụ hỗ trợ tiện dụng của bộ thư viện .NET của Microsoft. Công cụ này giúp người lập trình viên có thể xuất ra các báo cáo dựa trên dữ liệu có sẵn trong hệ thống, dành cho những lập trình viên đang gặp khó khăn trong dự án của mình khi muốn thêm vào chức năng xuất ra biểu mẫu báo cáo từ các dữ liệu có sẵn và sử dụng công nghệ WPF.
C# Hiếu Nguyễn 2014-06-18 00:45:21

Giới thiệu

Report Viewer là một công cụ hỗ trợ tiện dụng của bộ thư viện .NET của Microsoft. Công cụ này giúp người lập trình viên có thể xuất ra các báo cáo dựa trên dữ liệu có sẵn trong hệ thống. Tuy nhiên, với công nghệ WPF thì bỗng nhiên control này biến mất khiến cho người lập trình viên muốn thêm chức năng báo cáo vào phần mềm của mình gặp nhiều khó khăn và phải sử dụng các bộ công cụ bên ngoài khác gây ra khá nhiều phiền toái.

Tiền đề bài viết

Trong quá trình làm dự án, tác giả đã nghiên cứu, tìm tòi và sử dụng control này trong WPF mà không cần phải thêm bất kỳ bộ công cụ bên ngoài nào khác và đúc kết những kinh nghiệm trong quá trình làm việc của mình thành bài viết này.

Đối tượng hướng đến

Những lập trình viên đang gặp khó khăn trong dự án của mình khi muốn thêm vào chức năng xuất ra biểu mẫu báo cáo từ các dữ liệu có sẵn và sử dụng công nghệ WPF.

Các chương trình cần sử dụng

Visual Studio Professional hoặc Ultimate. Hiện tại các bước hướng dẫn bên dưới tôi sử dụng Visual Studio 2012 Ultimate.

Hướng dẫn

Bước 1

Các bạn tạo 1 cửa sổ mới (Chọn project hiện tại sau đó chuột phải bấm vào menu “Add..” chọn “Window”, sau đó chuột phải vào cửa sổ vừa tạo ở khung Solution Explorer và chọn Add Reference

ss_1

Bước 2

Ở trang xaml của cửa sổ vừa tạo, các bạn kéo thả control WindowsFormsHost vào cửa sổ vừa tạo và thiết lập như sau:

<Window x:Class="WpfApplication1.MainWindow"
	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	xmlns:rv="clr-namespace:Microsoft.Reporting.WinForms;
		assembly=Microsoft.ReportViewer.WinForms" 
	Title="MainWindow" Height="350" Width="525">
    <Grid>
        <WindowsFormsHost VerticalAlignment="Top" HorizontalAlignment="Left" 
			Width="100" Height="100" Margin="127,191,0,0"/>
        <WindowsFormsHost>
            <rv:ReportViewer x:Name="_reportViewer"/>
        </WindowsFormsHost>
    </Grid>
</Window>

Bước 3

Các bạn chuột phải vào project và chọn Add new item, chọn Report Wizard

ss_2

Bước 4

Các bạn lần lượt thiết lập Data Set trong cửa sổ Report Wizard

ss_3

Các bạn chọn Database và bấm Next.

ss_4

Chọn Dataset và bấm Next.

ss_5

Khi các bạn chưa thêm database vào project của mình, các bạn chọn New Connection.. để thêm database. Ở đây vì mình đã thêm database "RAPCHIEUPHIM". Sau đó các bạn bấm Next sẽ hiện cửa sổ như trên, các bạn chọn "No".

ss_6

Các bạn chọn Next và đợi load dữ liệu từ database.

ss_7

Ở khung DataSet name, các bạn đặt tên cho Data set source của mình, lưu ý là các bạn nên đặt tên sao cho dễ nhớ vì tên này sẽ dùng để truy xuất data set ở trong phần tải report.

Một dataset bao gồm nhiều thành phần của database tạo nên, ở đây tôi chọn Data Set là bảng KHACHHANG. Sau khi đã chọn và đặt tên, các bạn bấm Finish.

ss_8

Sau khi cửa sổ này xuất hiện, các bạn đặt tên cho Data set và bấm Next

ss_9

Ở bảng này, chúng ta chọn thuộc tính của Data set sẽ hiển thị trong report, ở đây tôi chọn hiển thị tất cả các thuộc tính của Bảng KHACHHANG nên tôi kéo thả toàn bộ thuộc tính ở vùng “Available fields” sang vùng “Values”. Sau khi đã chọn thuộc tính cần hiển thị, các bạn bấm Next.

ss_10

Các bạn bấm Next để tiếp tục.

ss_11

Ở cửa sổ này, các bạn chọn style của report, ở đây tôi để là mặc định và bấm Finish để hoàn tất.

Bước 5

Thiết lập trong file .cs của cửa sổ hiển thị report.

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        _reportViewer.Load += ReportViewer_Load;
    }

    private bool _isReportViewerLoaded;

    private void ReportViewer_Load(object sender, EventArgs e)
    {
        if (!_isReportViewerLoaded)
        {
            Microsoft.Reporting.WinForms.ReportDataSource reportDataSource1 = 
                        new Microsoft.Reporting.WinForms.ReportDataSource();

            NameOfDataSet dataset = new NameOfDataSet();
            dataset.BeginInit();

            reportDataSource1.Name = "NameOfDataSet";
            reportDataSource1.Value = dataset.KHACHHANG;
            this._reportViewer.LocalReport.DataSources.Add(reportDataSource1);
            this._reportViewer.LocalReport.ReportEmbeddedResource =
                        "WpfApplication1.NameOfReport.rdlc";

            dataset.EndInit();

            //fill data into adventureWorksDataSet
            NameOfDataSetTableAdapters.KHACHHANGTableAdapter datasetAdapter =
                        new NameOfDataSetTableAdapters.KHACHHANGTableAdapter();

            datasetAdapter.ClearBeforeFill = true;
            datasetAdapter.Fill(dataset.KHACHHANG);

            _reportViewer.RefreshReport();

            _isReportViewerLoaded = true;
        }
    }
}

Và cuối cùng là kết quả sau khi chạy chương trình.

ss_12