You may come across a situation, where you may have to display multiple headers rather just single one, and also some of these header or footer values has to be updated dynamically. Here is a simple example on how to do it using a simple ASPX page.
WebForm1.aspx
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="WebForm1.aspx.vb" Inherits="WebApplication1.WebForm1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Test Multi Header Gridview</title>
</head>
<body>
<form id="form1" runat="server">
<div id="searchArea" align=center>
<asp:Button ID="btnGetData" runat="server" Text="Get Data" />
<br />
</div>
<div align="center">
<asp:GridView ID="gvwRecord" runat="server" AutoGenerateColumns="false" FooterStyle-Wrap="false"
EmptyDataText="No data is available for this search criteria." DataKeyNames="ID" AllowPaging="false" >
<Columns>
<asp:BoundField DataField="ID" HeaderText="ID" ItemStyle-HorizontalAlign="left"/>
<asp:BoundField DataField="Name" HeaderText="Name" ItemStyle-HorizontalAlign="left" ItemStyle-Wrap="false" />
<asp:BoundField DataField="Age" HeaderText="Age" ItemStyle-HorizontalAlign="Right" ItemStyle-Wrap="false" />
<asp:BoundField DataField="Sex" HeaderText="Sex" ItemStyle-HorizontalAlign="Right" />
<asp:BoundField DataField="Title" HeaderText="Title" ItemStyle-Wrap="false"/>
</Columns>
</asp:GridView>
</div>
</form>
</body>
</html>
WebForm1.aspx.vb
The sample is generated for the test purpose
Public Class WebForm1
Inherits System.Web.UI.Page
Protected Sub btnGetData_Click(sender As Object, e As EventArgs) Handles btnGetData.Click
Dim tst As New TestRecord
Dim recs As List(Of TestRecord) = tst.LoadData
Session("Data") = recs
gvwRecord.DataSource = recs
gvwRecord.DataBind()
End Sub
Private Sub gvwRecord_RowCreated(sender As Object, e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvwRecord.RowCreated
If e.Row.RowType = DataControlRowType.Header Then
Dim headerCell1 As TableCell = New TableCell()
Dim headerCell2 As TableCell = New TableCell()
headerCell1.ColumnSpan = 3
headerCell1.Text = "Main Header 1"
headerCell1.BackColor = Drawing.Color.LightGray
headerCell1.HorizontalAlign = HorizontalAlign.Center
headerCell2.ColumnSpan = 2
headerCell2.Text = "Main Header 2"
headerCell2.BackColor = Drawing.Color.LightGray
headerCell2.HorizontalAlign = HorizontalAlign.Center
Dim rowHeader1 As GridViewRow = New GridViewRow(0, 0, DataControlRowType.Header, DataControlRowState.Normal)
rowHeader1.Cells.Add(headerCell1)
rowHeader1.Cells.Add(headerCell2)
rowHeader1.ForeColor = Drawing.Color.Black
rowHeader1.Font.Bold = True
rowHeader1.Visible = True
gvwRecord.Controls(0).Controls.AddAt(0, rowHeader1)
Dim fields2 As TableCellCollection = e.Row.Cells
Dim headerCell11 As TableCell = New TableCell()
Dim headerCell12 As TableCell = New TableCell()
headerCell11.ColumnSpan = 2
headerCell11.Text = "ID and Name"
headerCell11.BackColor = Drawing.Color.Maroon
headerCell12.ColumnSpan = 3
headerCell12.Text = "Age and Sex"
headerCell12.BackColor = Drawing.Color.Maroon
Dim rowHeader2 As GridViewRow = New GridViewRow(1, 1, DataControlRowType.Header, DataControlRowState.Normal)
rowHeader2.Cells.Add(headerCell11)
rowHeader2.Cells.Add(headerCell12)
rowHeader2.Font.Size = 12
rowHeader2.ForeColor = Drawing.Color.White
rowHeader2.HorizontalAlign = HorizontalAlign.Center
rowHeader2.Visible = True
rowHeader2.Font.Bold = True
gvwRecord.Controls(0).Controls.AddAt(1, rowHeader2)
ElseIf e.Row.RowType = DataControlRowType.Footer Then
Dim footerCell1 As TableCell = New TableCell()
Dim footerCell2 As TableCell = New TableCell()
Dim footerCell3 As TableCell = New TableCell()
Dim footerCell4 As TableCell = New TableCell()
Dim dataRecs As List(Of TestRecord) = Nothing
Dim totalRec As Integer = 0
Dim totalMale As Integer = 0
Dim totalFemale As Integer = 0
Dim totalAgeBelow30 As Integer = 0
Dim totalAgeAbove30 As Integer = 0
If Session("Data") IsNot Nothing Then
dataRecs = DirectCast(Session("Data"), List(Of TestRecord))
If Not dataRecs Is Nothing AndAlso dataRecs.Count > 0 Then
totalRec = dataRecs.Count
Dim list1 = From r As TestRecord In dataRecs Where r.Sex = "Male"
totalMale = list1.Count
Dim list2 = From r As TestRecord In dataRecs Where r.Sex = "Female"
totalFemale = list2.Count
Dim list3 = From r As TestRecord In dataRecs Where r.Age < 30
totalAgeBelow30 = list3.Count
Dim list4 = From r As TestRecord In dataRecs Where r.Age >= 30
totalAgeAbove30 = list4.Count
End If
End If
footerCell1.Text = "Summary"
footerCell2.Text = "Age [< 30yrs: " & totalAgeBelow30.ToString() & "] [>=30yrs:" & totalAgeAbove30.ToString() & "]"
footerCell3.ColumnSpan = 2
footerCell3.Text = "Male: " & totalMale.ToString() & " Female:" & totalFemale.ToString()
footerCell4.Text = "Total Count:" & totalRec.ToString()
Dim rowFooter1 As GridViewRow = New GridViewRow(gvwRecord.Rows.Count + 3, 0, DataControlRowType.Footer, DataControlRowState.Normal)
rowFooter1.Cells.Add(footerCell1)
rowFooter1.Cells.Add(footerCell2)
rowFooter1.Cells.Add(footerCell3)
rowFooter1.Cells.Add(footerCell4)
rowFooter1.ForeColor = Drawing.Color.Black
rowFooter1.BackColor = Drawing.Color.LightGray
rowFooter1.HorizontalAlign = HorizontalAlign.Left
rowFooter1.Font.Bold = True
rowFooter1.Visible = True
For cellCount As Integer = 0 To rowFooter1.Cells.Count - 1
rowFooter1.Cells(cellCount).Wrap = False
Next
gvwRecord.Controls(0).Controls.AddAt(gvwRecord.Rows.Count + 3, rowFooter1)
End If
End Sub
End Class
Public Class TestRecord
Public Property ID As Integer = 0
Public Property Name As String = String.Empty
Public Property Age As Integer = 18
Public Property Sex As String = "Male"
Public Property Title As String = "CEO"
Public Sub New()
End Sub
Public Sub New(ByVal ID As Integer, ByVal name As String, ByVal age As Integer, ByVal sex As String, ByVal title As String)
Me.ID = ID
Me.Name = name
Me.Age = age
Me.Sex = sex
Me.Title = title
End Sub
Public Function LoadData() As List(Of TestRecord)
Dim recs As New List(Of TestRecord)
For i = 0 To 10
Dim rec As New TestRecord(i, "LastName" & i.ToString & ", FirstName" & i.ToString(), 25 + i, IIf(i Mod 2 = 0, "Male", "Female").ToString, "Title #" & i.ToString)
recs.Add(rec)
Next
Return recs
End Function
End Class
Output at the runtime
No comments:
Post a Comment