- [SQLSERVER] Loại bỏ Restricted User trên database MSSQL
- [C#] Hướng dẫn tạo mã QRcode Style trên winform
- [C#] Hướng dẫn sử dụng temp mail service api trên winform
- [C#] Hướng dẫn tạo mã thanh toán VietQR Pay không sử dụng API trên winform
- [C#] Hướng Dẫn Tạo Windows Service Đơn Giản Bằng Topshelf
- [C#] Chia sẻ source code đọc dữ liệu từ Google Sheet trên winform
- [C#] Chia sẻ source code tạo mã QR MOMO đa năng Winform
- [C#] Chia sẻ source code phần mềm lên lịch tự động chạy ứng dụng Scheduler Task Winform
- [Phần mềm] Tải và cài đặt phần mềm Sublime Text 4180 full version
- [C#] Hướng dẫn download file từ Minio Server Winform
- [C#] Hướng dẫn đăng nhập zalo login sử dụng API v4 trên winform
- [SOFTWARE] Phần mềm gởi tin nhắn Zalo Marketing Pro giá rẻ mềm nhất thị trường
- [C#] Việt hóa Text Button trên MessageBox Dialog Winform
- [DEVEXPRESS] Chia sẻ code các tạo report in nhiều hóa đơn trên XtraReport C#
- [POWER AUTOMATE] Hướng dẫn gởi tin nhắn zalo từ file Excel - No code
- [C#] Chia sẻ code lock và unlock user trong domain Window
- [DEVEXPRESS] Vẽ Biểu Đồ Stock Chứng Khoán - Công Cụ Thiết Yếu Cho Nhà Đầu Tư trên Winform
- [C#] Hướng dẫn bảo mật ứng dụng 2FA (Multi-factor Authentication) trên Winform
- [C#] Hướng dẫn convert HTML code sang PDF File trên NetCore 7 Winform
- [C#] Hướng dẫn viết ứng dụng chat với Gemini AI Google Winform
[DEVEXPRESS] Hướng dẫn tạo Report động - Tutorial create dynamic xtraReport in VB.NET
Hôm nay, mình hướng dẫn các bạn cách tạo report động, sử dụng Xtra Report trong Devexpress. Như các bạn đã biết, để thiết kế report mình thường tạo những report tĩnh, tất là dữ liệu thay đổi được còn các field name thì thường mình cố định. Vì thế, nó sẽ rất bất tiện, nếu ta thiết kế nhiều mẫu report cho mỗi người dùng.
Vd: Nhân viên A muốn có report hiện đầy đủ thông tin và preview ở trang đứng. Nhưng nhân viên B lại muốn hiển thị ít thông tin, chỉ hiển thị những thông tin cần thiết, và in trang nằm.
Thì mình phải thiết kế nhiều report cho mỗi người dùng khác nhau. Hay thiết kế report có template chung nhưng lại khác table name, thì mình cũng phải mất nhiều thời gian để thiết kế lại những report cho mỗi người cần sử dụng. Chính vì vậy, hôm nay, mình viết hướng dẫn này giúp các bạn thiết kế nhanh Report, cho người dùng có thể tùy biến cao.
Giao diện chương trình demo:
Ở demo này, mình tích hợp cho người dùng có thể chèn tiêu đề report một cách linh động và cho phép chọn trang báo cáo xem kiểu đứng hay nằm.
Mình có thể hợp thêm Watermask dưới dạng Text hay Picture.
Chương trình demo trên: mình sử dụng Visual Studio 2015 và Devexpress 15.2. Vì thế, các bạn muốn chạy ứng dụng hay cài đặt những chương trình trên, các bạn có thể tìm kiếm tại trang web http://laptrinhvb.net ở thanh tìm kiếm trên cùng nha.
Video Demo:
Bây giờ, mình bắt đầu code
1. Import thư viện vào
Imports System
Imports System.Data
Imports System.Drawing
Imports System.Text
Imports System.Windows.Forms
Imports DevExpress.XtraReports.UI
Imports System.Data.SqlClient
Imports DevExpress.XtraPrinting.Drawing
Imports DevExpress.XtraSplashScreen
Imports System.Threading
2. Viết các hàm kết nối và lấy database truy vấn.
Dim con As New SqlConnection
Public Sub Taoketnoi()
Dim str As String = "Data Source=.;Initial Catalog=NORTHWND;Integrated Security=True"
con.ConnectionString = str
con.Open()
End Sub
Public Sub Dongketnoi()
con.Close()
End Sub
Public Function LayDulieu(query As String) As DataSet
Taoketnoi()
Dim dt As New DataSet
Dim da As New SqlDataAdapter
da.SelectCommand = New SqlCommand(query, con)
da.Fill(dt)
Dongketnoi()
Return dt
End Function
3. Viết hàm tạo pageHeader, pageDetail, reportHeader và reportFooter
Public Sub InitBands(ByVal rep As XtraReport)
' Create bands
Dim detail As New DetailBand()
Dim pageHeader As New PageHeaderBand()
Dim reportHeader As New ReportHeaderBand()
Dim reportFooter As New ReportFooterBand()
reportHeader.Height = 40
detail.Height = 20
reportFooter.Height = 380
pageHeader.Height = 20
' Place the bands onto a report
rep.Bands.AddRange(New DevExpress.XtraReports.UI.Band() {reportHeader, detail, pageHeader, reportFooter})
End Sub
4. Viết hàm tạo XRTable trong xtraReport Devexpress
Public Sub InitDetailsBasedonXRTable(ByVal rep As XtraReport)
Dim ds As DataSet = (CType(rep.DataSource, DataSet))
Dim colCount As Integer = ds.Tables(0).Columns.Count
Dim colWidth As Integer = (rep.PageWidth - (rep.Margins.Left + rep.Margins.Right)) / colCount
rep.Margins = New System.Drawing.Printing.Margins(20, 20, 20, 20)
Dim tieude As New XRLabel
tieude.Text = txtTieude.Text
tieude.TextAlignment = DevExpress.XtraPrinting.TextAlignment.TopCenter
tieude.ForeColor = Color.Orange
tieude.Font = New Font("Tahoma", 20, FontStyle.Bold, GraphicsUnit.Pixel)
tieude.Width = Convert.ToInt32(rep.PageWidth - 50)
' Create a table to represent headers
Dim tableHeader As New XRTable()
tableHeader.Height = 40
tableHeader.BackColor = Color.Gray
tableHeader.ForeColor = Color.White
tableHeader.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter
tableHeader.Font = New Font("Tahoma", 12, FontStyle.Bold, GraphicsUnit.Pixel)
tableHeader.Width = (rep.PageWidth - (rep.Margins.Left + rep.Margins.Right))
tableHeader.Padding = New DevExpress.XtraPrinting.PaddingInfo(5, 5, 5, 5, 100.0F)
Dim headerRow As New XRTableRow()
headerRow.Width = tableHeader.Width
tableHeader.Rows.Add(headerRow)
tableHeader.BeginInit()
' Create a table to display data
Dim tableDetail As New XRTable()
tableDetail.Height = 20
tableDetail.Width = (rep.PageWidth - (rep.Margins.Left + rep.Margins.Right))
tableDetail.Font = New Font("Tahoma", 12, FontStyle.Regular, GraphicsUnit.Pixel)
Dim detailRow As New XRTableRow()
detailRow.Width = tableDetail.Width
tableDetail.Rows.Add(detailRow)
tableDetail.Padding = New DevExpress.XtraPrinting.PaddingInfo(5, 5, 5, 5, 100.0F)
tableDetail.BeginInit()
' Create table cells, fill the header cells with text, bind the cells to data
For i As Integer = 0 To colCount - 1
Dim headerCell As New XRTableCell()
headerCell.Text = ds.Tables(0).Columns(i).Caption
Dim detailCell As New XRTableCell()
detailCell.DataBindings.Add("Text", Nothing, ds.Tables(0).Columns(i).Caption)
If i = 0 Then
headerCell.Borders = DevExpress.XtraPrinting.BorderSide.Left Or DevExpress.XtraPrinting.BorderSide.Top Or DevExpress.XtraPrinting.BorderSide.Bottom
detailCell.Borders = DevExpress.XtraPrinting.BorderSide.Left Or DevExpress.XtraPrinting.BorderSide.Top Or DevExpress.XtraPrinting.BorderSide.Bottom
Else
headerCell.Borders = DevExpress.XtraPrinting.BorderSide.All
detailCell.Borders = DevExpress.XtraPrinting.BorderSide.All
End If
If i = 0 Then
headerCell.Width = 50
detailCell.Width = 50
detailCell.TextAlignment = DevExpress.XtraPrinting.TextAlignment.TopCenter
ElseIf i = 1 Then
headerCell.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleLeft
headerCell.Width = 130
detailCell.Width = 130
ElseIf i = 2 Then
headerCell.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleLeft
headerCell.Width = 70
detailCell.Width = 70
ElseIf i = 4 Then
headerCell.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleLeft
headerCell.Width = 145
detailCell.Width = 145
Else
headerCell.Width = colWidth
detailCell.Width = colWidth
End If
detailCell.Borders = DevExpress.XtraPrinting.BorderSide.Bottom Or DevExpress.XtraPrinting.BorderSide.Left Or DevExpress.XtraPrinting.BorderSide.Right
' Place the cells into the corresponding tables
headerRow.Cells.Add(headerCell)
detailRow.Cells.Add(detailCell)
Next i
tableHeader.EndInit()
tableDetail.EndInit()
' Place the table onto a report's Detail band
rep.Bands(BandKind.ReportHeader).Controls.Add(tieude)
rep.Bands(BandKind.PageHeader).Controls.Add(tableHeader)
rep.Bands(BandKind.Detail).Controls.Add(tableDetail)
End Sub
Ở các câu lệnh trên các bạn có thể chỉnh sửa để cấu hình height và width từng field name cho hợp lý, cũng như canh chỉnh margin, padding hay font chữ...
6. Viết hàm tạo Watermask dạng text
Sub SetTextWatermark(ps As XtraReport)
' Create the text watermark.
Dim textWatermark As New Watermark()
' Set watermark options.
textWatermark.Text = "HTTP://LAPTRINHVB.NET"
textWatermark.TextDirection = DirectionMode.ForwardDiagonal
textWatermark.Font = New Font(textWatermark.Font.FontFamily, 40)
textWatermark.ForeColor = Color.DodgerBlue
textWatermark.TextTransparency = 150
textWatermark.ShowBehind = False
textWatermark.PageRange = "1,3-5"
' Add the watermark to a document.
ps.Watermark.CopyFrom(textWatermark)
End Sub
7. Viết hàm tạo Watermask dạng hình ảnh (picture)
Public Sub SetPictureWatermark(ps As XtraReport)
' Create the picture watermark.
Dim pictureWatermark As New Watermark()
' Set watermark options.
pictureWatermark.Image = Bitmap.FromFile("logo.png")
pictureWatermark.ImageAlign = ContentAlignment.MiddleCenter
pictureWatermark.ImageTiling = False
pictureWatermark.ImageViewMode = ImageViewMode.Zoom
pictureWatermark.ImageTransparency = 150
pictureWatermark.ShowBehind = True
'pictureWatermark.PageRange = "2,4"
' Add the watermark to a document.
ps.Watermark.CopyFrom(pictureWatermark)
End Sub
8. Viết sự kiện cho nút tạo Dynamic Report theo câu truy vấn query và những lựa chọn page setup hay watermask ở dạng nào
Private Sub btnCreateReport_Click(sender As Object, e As EventArgs) Handles btnCreateReport.Click
SplashScreenManager.ShowForm(Me, GetType(loading), True, True, False)
' Create XtraReport instance
Dim rep As New XtraReport()
If grpPagesetup.Text = 0 Then
rep.PaperKind = System.Drawing.Printing.PaperKind.A4
Else
rep.PaperKind = System.Drawing.Printing.PaperKind.A4Rotated
End If
If grpWaterMark.Text = 0 Then
SetTextWatermark(rep)
Else
SetPictureWatermark(rep)
End If
rep.DataSource = LayDulieu(txtQuery.Text)
rep.DataMember = (CType(rep.DataSource, DataSet)).Tables(0).TableName
InitBands(rep)
InitDetailsBasedonXRTable(rep)
rep.ShowRibbonPreviewDialog()
SplashScreenManager.CloseForm(False)
End Sub
Chúc các bạn thành công. Mọi câu hỏi thắc mắc đến bài viết xin truy cập http://hoidap.laptrinhvb.net để được support.