CƠ BẢN
SỰ KIỆN
NÂNG CAO
FIREBASE
WINDOWS FORM
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

Tạo Report bằng ReportViewer trong C# Winforms

Trong bài viết này mình sẽ hướng dẫn các bạn cách tạo report bằng ReportViewer trong C# Winforms. Đây là chức năng thường được sử dụng trong các ứng dụng, dùng để in ra bản báo cáo hoặc in danh sách.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

1. Xây dựng giao diện form report trong C# Winforms

Việc đầu tiên chúng ta cần xây dựng giao diện cho form report như hình dưới đây.

bai10 02 png

Trong đó:

  • DataGridView: Hiển thị danh sách điểm với các columns STT, Mã HS, Họ Tên, Môn Học, Điểm.
  • Button "Hiển thị điểm": Khi người dùng nhấn chọn thì danh sách bảng điểm sẽ được hiển thị trên DataGridView.
  • Button "Tạo Report": Khi người dùng nhấn chọn thì report sẽ được tạo trên ReportViewer.
  • Button "Thoát": Yêu cầu người dùng xác nhận có muốn thoát hay không. Nếu chọn OK thì thoát, ngược lại thì hủy bỏ lệnh.
  • ReportViewer: Hiển thị report.

bai10 01 png

2. Tạo database và Stored Procedure trong SQL Server

Trong chương trình này mình sử dụng database StudentDB, các bạn có thể sử dụng đoạn code dưới đây để tạo database và thêm dữ liệu nhé.

Bài viết này được đăng tại [free tuts .net]

CREATE DATABASE StudentDB
GO
USE [StudentDB]
GO
/****** Object:  Table [dbo].[Diem]    Script Date: 8/25/2021 1:32:20 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Diem](
	[MaHS] [int] NOT NULL,
	[MaMH] [int] NOT NULL,
	[Diem] [float] NULL,
 CONSTRAINT [PK_Diem] PRIMARY KEY CLUSTERED 
(
	[MaHS] ASC,
	[MaMH] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

Proc lấy danh sách bảng điểm với các columns STT, Mã HS, Họ Tên, Môn Học, Điểm.

ALTER proc [dbo].[SP_LayDiem]
as
begin
	select ROW_NUMBER() OVER (ORDER BY MaHS) AS STT, MaHS,Name,TenMH,Diem 
	from Student, Diem, MonHoc 
	where Student.Id = Diem.MaHS and MonHoc.MaMH = Diem.MaMH
end

3. Kết nối SQL Server và hiển thị danh sách

Tạo chuỗi kết nối ở file App.config với server và database mà mình muốn sử dụng.

<add name="conStr" connectionString="server=DESKTOP-PQMLT59\VANQUYEN;database=StudentDB;integrated security=true" />

Khai báo và sử dụng các class SqlConnection, SqlDataAdapter, DataTable. Sau đó gọi chuỗi kết nối từ file App.config bằng thuộc tính ConfigurationManager.

SqlConnection con = new SqlConnection();
SqlDataAdapter da = new SqlDataAdapter();
DataTable dt = new DataTable();
con.ConnectionString = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString;

Sử dụng proc "SP_LayDiem" để lấy danh sách điểm và hiển thị vào DataGridView ở sự kiện button_click trong button "Hiển thị điểm".

private void btnHienThi_Click(object sender, EventArgs e)
{
    SqlConnection con = new SqlConnection();
    SqlDataAdapter da = new SqlDataAdapter();
    DataTable dt = new DataTable();
    con.ConnectionString = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString;

    try
    {
        con.Open();
        da.SelectCommand = new SqlCommand();
        da.SelectCommand.CommandText = "SP_LayDiem";
        da.SelectCommand.CommandType = CommandType.StoredProcedure;
        da.SelectCommand.Connection = con;
        da.Fill(dt);
        dtgDSDiem.DataSource = dt;
        con.Close();

        dtgDSDiem.Columns[0].Width = 60;
        dtgDSDiem.Columns[0].HeaderText = "STT";
        dtgDSDiem.Columns[1].Width = 80;
        dtgDSDiem.Columns[1].HeaderText = "Mã HS";
        dtgDSDiem.Columns[2].Width = 150;
        dtgDSDiem.Columns[2].HeaderText = "Họ Tên";
        dtgDSDiem.Columns[3].Width = 100;
        dtgDSDiem.Columns[3].HeaderText = "Môn học";
        dtgDSDiem.Columns[4].Width = 100;
        dtgDSDiem.Columns[4].HeaderText = "Điểm";
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

Xử lý sự kiện trên button "Thoát"

Để chắc chắn người dùng muốn thoát chương trình ta sẽ hiển thị hộp thoại yêu cầu người dùng xác nhận có muốn thoát hay không. Nếu chọn OK thì thoát, ngược lại thì hủy bỏ lệnh.

private void btnThoat_Click(object sender, EventArgs e)
{
    DialogResult dg = MessageBox.Show("Bạn có chắc muốn thoát?", "Thông báo", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
    if (dg == DialogResult.OK)
    {
        Application.Exit();
    }
}

4. Tạo report bằng ReportViewer trong C# Winforms

Bây giờ mình sẽ hướng dẫn cụ thể từng bước để tạo một report bằng ReportViewer trong C# Winforms.

Bước 1: Thêm class DataSet vào project.

Click chuột phải vào tên project chọn Add -> New item

bai10 03 png

Một cửa sổ mới hiện ra, ta chọn vào mục Data -> DataSet, sau đó đặt tên cho nó rồi nhấn Add để tạo.

bai10 04 png

Bước 2: Tạo report

Chọn vào hình tam giác nhỏ bên góc phải trên ReportViewer -> Design a new report.

bai10 05 png

Một cửa sổ hiện ra, ta chọn vào Database rồi Next.

bai10 06 png

Chọn vào Dataset để sử dụng Dataset cho project rồi Next.

bai10 07 png

Tiêp tục một cửa sổ hiện ra, ta chọn vào New Connection -> sau đó làm theo thứ tự các bước như hình dưới đây.

bai10 08 png

Sau khi Next, một cửa sổ nữa hiện ra. Ta chọn vào bảng muốn lấy hoặc proc muốn lấy. Ở đây mình sẽ chọn vào proc "SP_LayDiem" đã viết ở trên để lấy danh sách bảng điểm.

bai10 09 png

Sau khi Finish, ta chọn tiếp Next để sang một cửa sổ mới. Tại đây ta sẽ chọn các trường dữ liệu mà mình muốn hiển thị trên report, bằng cách kéo thả như hình dưới.

bai10 10 png

Cứ tiếp tục chọn Next cho đến khi kết thúc, kết quả sẽ được hiện như bảng dưới là thành công.

bai10 11 png

Bước 3: Chọn report cho ReportViewer.

Việc này khá đơn giản, chỉ cần chọn vào hình tam giác nhỏ ở góc phải trên ReportViewer -> report muốn hiển thị.

bai10 12 png

Bước 4: Xử lý sự kiện trên button "Tạo Report".

Sau khi chọn report cho ReportViewer, hệ thống sẽ tự sinh ra code để hiển thị. Nhiệm vụ của ta chỉ cần copy và paste ở sự kiện button_click trên button "Tạo Report" mà thôi.

private void btnReport_Click(object sender, EventArgs e)
{
    this.SP_LayDiemTableAdapter.Fill(this.StudentDBDataSet.SP_LayDiem);
    this.reportViewer1.RefreshReport();
}

Kết quả: Khi chọn button "Hiển thị điểm" và "Tạo Report".

bai10 13 png

*Lưu ý: Việc sử dụng ReportViewer rất tiện dụng, bởi nó có các chức năng kèm theo như Print, Export,... Vì vậy hãy tận dụng hết chức năng của nó nhé.

5. Code hoàn chỉnh tạo report trong C# Winforms

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ReportStudent
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
        }
        private void btnThoat_Click(object sender, EventArgs e)
        {
            DialogResult dg = MessageBox.Show("Bạn có chắc muốn thoát?", "Thông báo", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
            if (dg == DialogResult.OK)
            {
                Application.Exit();
            }
        }
        private void btnHienThi_Click(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection();
            SqlDataAdapter da = new SqlDataAdapter();
            DataTable dt = new DataTable();
            con.ConnectionString = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString;
            try {
                con.Open();
                da.SelectCommand = new SqlCommand();
                da.SelectCommand.CommandText = "SP_LayDiem";
                da.SelectCommand.CommandType = CommandType.StoredProcedure;
                da.SelectCommand.Connection = con;
                da.Fill(dt);
                dtgDSDiem.DataSource = dt;
                con.Close();

                dtgDSDiem.Columns[0].Width = 60;
                dtgDSDiem.Columns[0].HeaderText = "STT";
                dtgDSDiem.Columns[1].Width = 80;
                dtgDSDiem.Columns[1].HeaderText = "Mã HS";
                dtgDSDiem.Columns[2].Width = 150;
                dtgDSDiem.Columns[2].HeaderText = "Họ Tên";
                dtgDSDiem.Columns[3].Width = 100;
                dtgDSDiem.Columns[3].HeaderText = "Môn học";
                dtgDSDiem.Columns[4].Width = 100;
                dtgDSDiem.Columns[4].HeaderText = "Điểm";            
            }
            catch(Exception ex) {
                MessageBox.Show(ex.Message);
            }
        }
        private void btnReport_Click(object sender, EventArgs e)
        {
            this.SP_LayDiemTableAdapter.Fill(this.StudentDBDataSet.SP_LayDiem);
            this.reportViewer1.RefreshReport();
        }
    }
}

Trên đây là cách tạo report với ReportViewer trong C# Winforms. Ngoài ra còn có nhiều cách tạo report khác nhau, các bạn có thể tìm hiểu thêm nhé. Chúc các bạn thành công !!!!

Cùng chuyên mục:

Memento Design Pattern trong C# - Cách triển khai và ví dụ

Memento Design Pattern trong C# - Cách triển khai và ví dụ

Interpreter Design Pattern trong C# - Cách triển khai và ví dụ

Interpreter Design Pattern trong C# - Cách triển khai và ví dụ

Strategy Design Pattern trong C# - Cách triển khai và ví dụ

Strategy Design Pattern trong C# - Cách triển khai và ví dụ

Visitor Design Pattern trong C# - Cách triển khai và ví dụ

Visitor Design Pattern trong C# - Cách triển khai và ví dụ

Command Design Pattern trong C# - Cách triển khai và ví dụ

Command Design Pattern trong C# - Cách triển khai và ví dụ

Observer Design Pattern trong C# - Cách triển khai và ví dụ

Observer Design Pattern trong C# - Cách triển khai và ví dụ

Iterator Design Pattern trong C# - Cách triển khai và ví dụ

Iterator Design Pattern trong C# - Cách triển khai và ví dụ

Proxy Design Pattern trong C# - Cách triển khai và ví dụ

Proxy Design Pattern trong C# - Cách triển khai và ví dụ

Composite Design Pattern trong C# - Cách triển khai và ví dụ

Composite Design Pattern trong C# - Cách triển khai và ví dụ

Bridge Design Pattern trong C# - Cách triển khai và ví dụ

Bridge Design Pattern trong C# - Cách triển khai và ví dụ

Decorator Design Pattern trong C# - Cách triển khai và ví dụ

Decorator Design Pattern trong C# - Cách triển khai và ví dụ

Facade Design Pattern trong C# - Cách triển khai và ví dụ

Facade Design Pattern trong C# - Cách triển khai và ví dụ

Adapter Design Pattern trong C# - Cách triển khai và ví dụ

Adapter Design Pattern trong C# - Cách triển khai và ví dụ

Singleton Design Pattern trong C# - Cách triển khai và ví dụ

Singleton Design Pattern trong C# - Cách triển khai và ví dụ

Prototype Design Pattern trong C# - Cách triển khai và ví dụ

Prototype Design Pattern trong C# - Cách triển khai và ví dụ

Builder Design Pattern trong C# - Cách triển khai và ví dụ

Builder Design Pattern trong C# - Cách triển khai và ví dụ

Tự viết ứng dụng quản lý xe ra vào C# Winforms và Firebase

Tự viết ứng dụng quản lý xe ra vào C# Winforms và Firebase

Trong bài viết này Freetuts chia sẽ cho các bạn một ứng dụng khá thú…

Factory Design Pattern trong C# - Cách triển khai và ví dụ

Factory Design Pattern trong C# - Cách triển khai và ví dụ

Chúng ta sẽ tìm hiểu về Factory Design Pattern trong C# là gì? Cách triển…

Hướng dẫn giải phương trình bậc hai trong C#

Hướng dẫn giải phương trình bậc hai trong C#

Giải phương trình bậc nhất ax + b = 0 trong C#

Giải phương trình bậc nhất ax + b = 0 trong C#

Top