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.
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.
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.
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
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.
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.
Một cửa sổ hiện ra, ta chọn vào Database rồi Next.
Chọn vào Dataset để sử dụng Dataset cho project rồi Next.
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.
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.
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.
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.
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ị.
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".
*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 !!!!