Friday, March 27, 2009

Merging GridView Header Cell

Korang boleh merge cell untuk header gridview menggunakan function SetRenderMethodDelegate.
Tengok sample code kat bawah

Ni code yang aku dah convert ke vb.net (code asal c# boleh dirujuk di http://marss.co.ua/MergingGridViewHeaderColumns.aspx)


'//yang ni takperlu ubah ape2
'===========================

<Serializable()> _
Private Class MergedColumnsInfo
' indexes of merged columns
Public MergedColumns As New List(Of Integer)()
' key-value pairs: key = first column index, value = number of merged columns
Public StartColumns As New Hashtable()
' key-value pairs: key = first column index, value = common title of merged columns
Public Titles As New Hashtable()

'parameters: merged columns's indexes, common title of merged columns
Public Sub AddMergedColumns(ByVal columnsIndexes As Integer(), ByVal title As String)
MergedColumns.AddRange(columnsIndexes)
StartColumns.Add(columnsIndexes(0), columnsIndexes.Length)
Titles.Add(columnsIndexes(0), title)
End Sub
End Class

'property for storing of information about merged columns
Private ReadOnly Property info() As MergedColumnsInfo
Get
If ViewState("info") Is Nothing Then
ViewState("info") = New MergedColumnsInfo()
End If

Try
Return DirectCast(ViewState("info"), MergedColumnsInfo)
Catch ex As Exception
Return Nothing
End Try

End Get
End Property

'method for rendering of columns's headers
Private Sub RenderHeader(ByVal output As HtmlTextWriter, ByVal container As Control)
For i As Integer = 0 To container.Controls.Count - 1
Dim cell As TableCell = DirectCast(container.Controls(i), TableCell)
'stretch non merged columns for two rows
If Not info.MergedColumns.Contains(i) Then
cell.Attributes("rowspan") = "2"
cell.RenderControl(output)
'render merged columns's common title
ElseIf info.StartColumns.Contains(i) Then
output.Write(String.Format("{1}", info.StartColumns(i), info.Titles(i)))
End If
Next

'close first row
output.RenderEndTag()
'set attributes for second row
gview1.HeaderStyle.AddAttributesToRender(output)
'start second row
output.RenderBeginTag("tr")

'render second row (only merged columns)
For i As Integer = 0 To info.MergedColumns.Count - 1
Dim cell As TableCell = DirectCast(container.Controls(info.MergedColumns(i)), TableCell)
cell.RenderControl(output)
Next
End Sub

'kat event GridView_RowCreated() 'ni pun tak perlu ubah aper2
=========================
If e.Row.RowType = DataControlRowType.Header Then
e.Row.SetRenderMethodDelegate(AddressOf RenderHeader)
End If


'kat page_load event 'sini aje kalau nak set cell mane nak merge
================
If Not IsPostBack Then
info.AddMergedColumns(New Integer() {3, 4, 5}, "any text column baru") 'ni akan merge cell 3,4,5

'kalau nak merge lagi,just put same statement here

End If


note:so korang tak perlu pening2 buat kat itemTemplateField.
ko rang boleh copy sourcecode dari sumber asalnya dan test tengok hasilnya.Thanks to the coder!
Lagi satu,kalau tengah debug,kalau korang ubah any property value kat boundfield,korang kena run balik.so best practise,jgn ubah waktu application tgh running.

No comments: