Trong bài viết này, tôi xin giới thiệu với các bạn bộ công cụ DevExpress và cách tạo report với các control của ExtraReport. Theo như nhận xét của cá nhân tôi, thì ExtraReport khá dễ sử dụng, độ linh hoạt cao, có nhiều chức năng khá hay (có lẽ vì đây là bộ Tool dành cho VS 2005 của hãng phát triển thứ 3 nên tốt hơn Crytal Report của Microsoft rất nhiều).
Trước hết các bạn cần phải cài đặt bộ DevExpress, tôi cũng không rõ đây là phiên bản bao nhiêu, nhưng nó chỉ có thể chạy được trên VS 2005.
DOWNLOAD DevExpress (gồm bộ cài và keygen, các bạn phải tìm kiếm trên google, vì bộ cài lớn nên tôi không thể upload lên hosting được).
Sau khi cài đặt xong, các controls của DevExpress sẽ xuất hiện ở trên toolbar của Visual Studio như hình sau:
Trong bài viết này, tôi sẽ hướng dẫn các bạn bài đơn giản nhất là lấy dữ liệu từ bảng Customers (database Northwind có sẵn khi cài đặt SQL Server) và hiển thị ra report.
Bước 1: Tạo Project tên là Demo_DevExpress
Bước 2: Kéo control PrintPreviewBar vào form, kéo tiếp PrintControl vào form và set thuộc tính Dock = Fill.
Set PrintControl của PrintPreviewBar là printControl1 (đây là name của PrintControl mà bạn vừa kéo vào giao diện).
Bây giờ chúng ta sẽ có giao diện như sau:
Bước 3: Add ExtraReport V3 Class vào project và đặt tên là rptCustomers, trên report này sẽ hiển thị danh sách các khách hàng trong bảng Customers.
Set thuộc tính Landscape của report thành True, để có thể trình bày được nhiều cột dữ liệu hơn (cái này tùy vào lượng dữ liệu ít hay nhiều mà bạn set là true hoặc false).
Lúc này ở chế độ design của report vừa tạo ra, chúng ta thấy có 3 mục như sau:
PageHeader: các thành phần hiển thị trên đây sẽ xuất hiện trên đầu mỗi trang report.
Detail: Phần chi tiết, phần này sẽ hiển thị dữ liệu chính, thường là các dữ liệu có cấu trúc dạng bảng.
PageFooter: tương tự như PageHeader phần này hiển thị dữ liệu dưới cuối mỗi trang report.
Đối với bài toán cụ thể của chúng ta, tạm thời hãy xóa 2 mục PageHeader và PageFooter bằng cách đặt chuột lên mục đó và nhấn Delete.
Bước 4: Kích chuột phải vào mục Detail còn lại duy nhất chọn GroupHeader và GroupFooter.
Ý nghĩa của 2 mục này như sau:
GroupHeader: các thành phần đặt trên đây sẽ xuất hiện duy nhất một lần ở trang báo cáo đầu tiên. Ta có thể dùng mục này để hiển thị dòng tiêu đề báo cáo, tổng,… hoặc những thành phần hay dùng trong mỗi văn bản báo cáo thường thấy.
FootHeader: cách thành phần đặt trên mục này sẽ xuất hiện một lần duy nhất ở cuối trang báo cáo cuối cùng. Thường ta sẽ dùng để tính toán các tổng số ở mục Detail, hiển thị cách đoạn text như người làm báo cáo, ngày tháng,…
Nếu như thực hiện đúng các thao tác trên, chúng ta sẽ có được kết quả như sau:
Bước 5: Dùng XRLabel để hiển thị tiêu đề của báo cáo, ta sẽ kéo control XRLabel này vào mục GroupHeader.
Để hiện thị ảnh trên report, chúng ta dùng control XRPictureBox. Sau đó, trang trí lại một chút chúng ta có thể được một báo cáo có định dạng như sau
.
Bước 6: Bây giờ tới bước quan trọng nhất là hiển thị danh sách chi tiết các khách hàng lên báo cáo. Vì dữ liệu là dạng bảng, nên chúng ta sẽ dùng XRTable để trình bày dữ liệu cho đẹp. Các bạn kéo vào GroupHeader một control XRTable và thêm bớt các cột tiêu đề hiển thị dữ liệu tùy theo các bạn muốn lấy bao nhiêu trường, việc thêm bớt các column bằng cách chọn chuột phải vào table và chọn Insert à Column To Left, hoặc Column To Right.
Set thuộc tính Border của XRTable này là All
Kích vào từng Cell của bảng vừa tạo chọn thuộc tính TextAlignment là MiddleCenter.
Bước 7: Kéo vào Detail một control XRTable khác, bảng này dùng để hiện thị thông tin chi tiết của các khách hàng (bảng này có số cột bằng với số cột của bảng trên GroupHeader). Set các thuộc tính tương tự với bảng phía bên trên và có một số sự khác biệt như sau:
Set thêm thuộc tính BorderColor (dùng các màu nhạt hơn màu bảng trên).
Trong bảng Customer, tôi lấy một số trường như sau: CustomerID, ContactName, Address, City, Phone.
Đặt lại thuộc tính Name cho các xrTableCell (có thể không cần, nhưng theo tôi các bạn nên đặt tên của các cell này trùng với các trường trong database cần hiển thị, như vậy sẽ dễ nhớ khi viết code hơn). Ví dụ xrTableCell6 thành colCustomerID,.v.v.
Xong bước này, chúng ta sẽ có một báo cáo có giao diện ban đầu như sau:
Bước 8: Chúng ta tiếp tục công việc bằng cách bắt tay vào viết code. Tại giao diện design của report, chúng ta nhấn F7.
Các bạn viết hàm BindData() để hiển thị dữ liệu lên các cell mà chúng ta vừa đặt tên.
public void BindData()
{
colCustomerID.DataBindings.Add("Text", DataSource, "CustomerID");
colContactName.DataBindings.Add("Text", DataSource, "ContactName");
colAddress.DataBindings.Add("Text", DataSource, "Address");
colCity.DataBindings.Add("Text", DataSource, "City");
colPhone.DataBindings.Add("Text", DataSource, "Phone");
}
Có một chú ý là tên các trường dữ liệu mà bạn muốn hiển thị ra phải đúng chữ hoa, chữ thường so với tên trường mà bạn đã select trong database.
Bước 9: Quay trở lại Form hiển thị báo cáo, chúng ta viết một hàm trả ra DataSet chứa dữ liệu 10 khách hàng trong bảng Customers, đặt tên là ShowTop10Customers()
private DataSet ShowTop10Customers()
{
connect = new SqlConnection(strConnect);
connect.Open();
command = new SqlCommand("SELECT TOP 10 * FROM Customers", connect);
adapter = new SqlDataAdapter(command);
ds = new DataSet();
adapter.Fill(ds);
return ds;
}
Tại sự kiện Form_Load chúng ta chỉ việc gọi hàm BindData() từ rptCustomers và gán DataSource của nó chính là DataSet chứa dữ liệu mà chúng ta vừa lấy.
private void Form1_Load(object sender, EventArgs e)
{
rptCustomers rpt = new rptCustomers();
rpt.DataSource = ShowTop10Customers();
rpt.BindData();
printControl1.PrintingSystem = rpt.PrintingSystem;
rpt.CreateDocument();
}
OK, như vậy có thể gọi là tạm ổn, bây giờ chúng ta hãy thử nhấn Cltr + F5 xem chúng ta có gì nào? Nếu không có lỗi gì xảy ra, chúng ta sẽ được một báo cáo cũng khá ấn tượng như sau:








No comments:
Post a Comment