เนื่องจากหน้าเดิมผมใช้ Gridview ในการแสดงผล ดังนั้นผมเลยเขียนโปรแกรมเพื่อให้ user สามารถเพิ่ม/ลด column ของ Gridview ได้
ก่อนอื่นเรามาเตรียมโค้ดของ Gridview ก่อนครับ ในเวอร์ชันนี้เราจะให้ Dynamic Gridview รองรับแค่ Label เท่านั้น ผมเริ่มจากการสร้าง GridViewLabelTemplate Class สำหรับ Class ตัวนี้มีไว้สำหรับสร้าง ItemTemplate ซึ่งประกอบด้วย Label 1 อัน
Public Class GridViewLabelTemplate
Implements ITemplate
Private _lblID As String
Public Sub New(ByVal ID As String)
_lblID = ID
End Sub
Public Sub InstantiateIn(ByVal container As System.Web.UI.Control) _
Implements System.Web.UI.ITemplate.InstantiateIn
Dim lbl As New Label
lbl.ID = _lblID
container.Controls.Add(lbl)
AddHandler lbl.DataBinding, AddressOf Me.DataBinding
End Sub
Private Sub DataBinding(ByVal sender As Object, ByVal e As EventArgs)
' Do nothing but needed for row databinding event
End Sub
End Class
จากนั้นก็มาสร้าง Static Class อีกตัว เพื่อเป็น Gridview Utility สำหรับเพิ่ม Column (ItemTemplate)
Public Class GridViewUtility
Public Shared Sub AddLabelTemplate(ByVal grid As GridView, _
ByVal labelID As String, _
ByVal HeaderText As String, _
ByVal columnWidth As Integer, _
Optional ByVal fontWeight As Integer = 11)
Dim f As New TemplateField
f.HeaderText = HeaderText
f.HeaderStyle.Width = Unit.Pixel(columnWidth)
f.HeaderStyle.HorizontalAlign = HorizontalAlign.Left
f.HeaderStyle.Font.Name = "Tahoma"
f.ItemStyle.HorizontalAlign = HorizontalAlign.Left
f.ItemStyle.Font.Size = Unit.Pixel(fontWeight).Value
f.ItemStyle.Font.Name = "Tahoma"
f.ItemTemplate = New GridViewLabelTemplate(labelID)
grid.Columns.Add(f)
End Sub
End Class
ขั้นเตรียมตัวเรียบร้อย ก็มาเริ่มเขียน aspx กันครับ ส่วนหน้าจอที่ให้ user เลือก
ไม่ได้เขียนโค้ดให้ แค่คร่าวๆคือ เมื่อ user กดปุ่ม Advance จะแสดง div ที่ซ่อนไว้ ว่ามีคอลัมภ์อะไรให้เลือกบ้าง โดยจะมี Default อยู่ 8 คอลัมภ์ และ user สามารถเลือกได้ว่าอยากเห็นข้อมูลที่ห้น้าจอหรือ export เป็น excel หรือ pdf พอ user กดปุ่ม Export โปรแกรมก็จะไปสร้าง Gridview ให้ แล้วเอา Gridview ไปแสดงผลตามที่ต้องการ
คราวนี้มาดูโค้ดส่วนที่สร้าง Gridview บ้างครับ
Dim lst As List(Of CMS.Library.ContactList) = Session(MAILING_LIST_SESSION)
'Add empty row
lst.Add(New CMS.Library.ContactList)
Dim divReport As New Panel
Dim pHeader As New Panel
Dim lblHeader As New Label
lblHeader.Text = "List of mailing list by lawyer."
lblHeader.Font.Bold = True
lblHeader.Font.Size = Unit.Pixel(16).Value
pHeader.Controls.Add(lblHeader)
divReport.Controls.Add(pHeader)
Dim pCaption As New Panel
Dim lblCaption As New Label
lblCaption.Text = "Lawyer: " & Me.lblLawyerName.Text
lblCaption.Font.Size = Unit.Pixel(14).Value
lblCaption.Font.Italic = True
pCaption.Controls.Add(lblCaption)
divReport.Controls.Add(pCaption)
Dim pLinespace As New Panel
Dim lblSpace As New Label
lblSpace.Text = "
"
pLinespace.Controls.Add(lblSpace)
divReport.Controls.Add(pLinespace)
Dim gvReport As New GridView
divReport.Controls.Add(gvReport)
gvReport.AutoGenerateColumns = False
gvReport.RowStyle.VerticalAlign = VerticalAlign.Top
gvReport.BorderStyle = BorderStyle.Solid
gvReport.BorderWidth = Unit.Pixel(1)
gvReport.GridLines = GridLines.Both
gvReport.HeaderStyle.BackColor = Drawing.Color.Silver
AddHandler gvReport.RowDataBound, AddressOf GridView_RowDataBound
If chkPrefix.Checked Then GridViewUtility.AddLabelTemplate(gvReport, "Prefix", "Prefix", 100)
If chkContactname.Checked Then GridViewUtility.AddLabelTemplate(gvReport, "FirstName", "First Name", 100)
If chkContactMiddleName.Checked Then _
GridViewUtility.AddLabelTemplate(gvReport, "MiddleName", "Middle Name", 100)
If chkContactLastName.Checked Then GridViewUtility.AddLabelTemplate(gvReport, "LastName", "Last Name", 100)
If chkCompanyName.Checked Then _
GridViewUtility.AddLabelTemplate(gvReport, "CompanyName", "Company", 300)
If chkClientNo.Checked Then GridViewUtility.AddLabelTemplate(gvReport, "ClientNo", "Client No", 100)
If chkDepartment.Checked Then _
GridViewUtility.AddLabelTemplate(gvReport, "DepartmentTitle", "DepartmentTitle", 100)
If chkTitle.Checked Then GridViewUtility.AddLabelTemplate(gvReport, "JobTitle", "Job Title", 100)
...
...
...
gvReport.DataSource = lst
gvReport.DataBind()
พอเราสั่ง DataBind โปรแกรมก็จะไปทำ RowDataBinding เราก็ต้องไปเขียนโค้ดเพื่อเอาข้อมูลไปใส่ใน ItemTemplate ให้ถูกต้อง
Private Sub GridView_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
'Skip for last empty row
If e.Row.DataItemIndex = TryCast(Session(MAILING_LIST_SESSION), IList).Count - 1 Then Exit Sub
If e.Row.RowType = DataControlRowType.DataRow Then
Dim ml As CMS.Library.ContactList = TryCast(e.Row.DataItem, CMS.Library.ContactList)
If chkPrefix.Checked AndAlso ml.Contact.Prefix IsNot Nothing Then _
DirectCast(e.Row.FindControl("Prefix"), Label).Text = ml.Contact.Prefix.PrefixCode
If chkContactname.Checked AndAlso ml.Contact.FirstName IsNot Nothing Then _
DirectCast(e.Row.FindControl("FirstName"), Label).Text = ml.Contact.FirstName.ToString
If chkContactMiddleName.Checked AndAlso ml.Contact.MiddleName IsNot Nothing Then _
DirectCast(e.Row.FindControl("MiddleName"), Label).Text = ml.Contact.MiddleName.ToString
If chkContactLastName.Checked AndAlso ml.Contact.LastName IsNot Nothing Then _
DirectCast(e.Row.FindControl("LastName"), Label).Text = ml.Contact.LastName.ToString
If chkClientNo.Checked AndAlso ml.Company.ClientNo IsNot Nothing Then _
DirectCast(e.Row.FindControl("ClientNo"), Label).Text = ml.Company.ClientNo.ToString
If chkDepartment.Checked AndAlso ml.DepartmentTitle IsNot Nothing Then _
DirectCast(e.Row.FindControl("DepartmentTitle"), Label).Text = ml.DepartmentTitle
...
...
...
If ml.Active <> CMS.Library.Constants.ACTIVE Then
e.Row.ForeColor = Drawing.Color.Red
e.Row.Font.Italic = True
End If
End If
End Sub
โค้ดส่วนที่สำคัญก็มีเท่านี้ครับ ส่วนที่ export ไป excel หรือ pdf ก็ไม่ยากแล้ว
ถ้าอนาคตมีการ modify หรือรองรับ control อื่นๆนอกจาก label เพิ่มจะมาอัพเดทอีกทีครับ
1 ความคิดเห็น:
ขอบคุณครับ ขอเอาแนวคิดไปลองใช้นะครับ
แสดงความคิดเห็น