如何实现datagrid控件多层表头

如何实现datagrid控件多层表头,第1张

=================

<%@ Page Language="C#" AutoEventWireup="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

// 计算数据,完全可以从数据看取得

ICollection CreateDataSource( )

{

System.Data.DataTable dt = new System.Data.DataTable()

System.Data.DataRow dr

dt.Columns.Add(new System.Data.DataColumn("学生班级", typeof(System.String)))

dt.Columns.Add(new System.Data.DataColumn("学生姓名", typeof(System.String)))

dt.Columns.Add(new System.Data.DataColumn("语文", typeof(System.Decimal)))

dt.Columns.Add(new System.Data.DataColumn("数学", typeof(System.Decimal)))

dt.Columns.Add(new System.Data.DataColumn("英语", typeof(System.Decimal)))

dt.Columns.Add(new System.Data.DataColumn("计算机", typeof(System.Decimal)))

for (int i = 0i <8i++)

{

System.Random rd = new System.Random(Environment.TickCount * i)

dr = dt.NewRow()

dr[0] = "班级" + i.ToString()

dr[1] = "学生" + i.ToString()

dr[2] = System.Math.Round(rd.NextDouble() * 100, 2)

dr[3] = System.Math.Round(rd.NextDouble() * 100, 2)

dr[4] = System.Math.Round(rd.NextDouble() * 100, 2)

dr[5] = System.Math.Round(rd.NextDouble() * 100, 2)

dt.Rows.Add(dr)

}

System.Data.DataView dv = new System.Data.DataView(dt)

return dv

}

protected void Page_Load( object sender, EventArgs e )

{

if (!IsPostBack)

{

GridView1.BorderColor = System.Drawing.Color.DarkOrange

GridView1.DataSource = CreateDataSource()

GridView1.DataBind()

}

}

protected void GridView1_RowCreated( object sender, GridViewRowEventArgs e )

{

if (e.Row.RowType == DataControlRowType.Header)

{

//创建一个GridViewRow,相当于表格的 TR 一行

GridViewRow rowHeader = new GridViewRow(0, 0, DataControlRowType.Header, DataControlRowState.Normal)

string HeaderBackColor = "#EDEDED"

rowHeader.BackColor = System.Drawing.ColorTranslator.FromHtml(HeaderBackColor)

//实现确定要显示的表头样式,也可以通过计算生成

//<tr>

// <td rowspan='2'>关键单元格</td>

// <td colspan='2'>表头文字</td>

// <td colspan='2'>表头文字</td>

// <td>表头文字</td>

// </tr>

// <tr bgcolor='#FFF'>

// <td colspan='2'>表头文字</td>

// <td rowspan='2'>表头文字</td>

// <td colspan='2'>表头文字</td>

// </tr>

// <tr bgcolor='#FFF'>

// <td>表头文字</td>

// <td>表头文字</td>

// <td>表头文字</td>

// <td>表头文字</td>

// <td>表头文字</td>"

// </tr>

// 上面的样式可以设置斜线

Literal newCells = new Literal()

newCells.Text = @"表头文字1</th>

<th colspan='2'>表头文字2</th>

<th colspan='2'>表头文字3</th>

<th>表头文字4</th>

</tr>

<tr bgcolor='" + HeaderBackColor + "'>"

newCells.Text += @"

<th colspan='2'>表头文字5</th>

<th rowspan='2'>表头文字6</th>

<th colspan='2'>表头文字7</th>

</tr>

<tr bgcolor='" + HeaderBackColor + "'>"

newCells.Text += @"

<th>表头文字8</th>

<th>表头文字9</th>

<th>表头文字10</th>

<th>表头文字11</th>

<th>表头文字12"

TableCellCollection cells = e.Row.Cells

TableHeaderCell headerCell = new TableHeaderCell()

//下面的属性设置与 <td rowspan='2'>关键单元格</td>要一致

headerCell.RowSpan = 2

headerCell.Controls.Add(newCells)

rowHeader.Cells.Add(headerCell)

rowHeader.Cells.Add(headerCell)

rowHeader.Visible = true

//添加到 GridView1

GridView1.Controls[0].Controls.AddAt(0, rowHeader)

}

}

protected void GridView1_RowDataBound( object sender, GridViewRowEventArgs e )

{

if (e.Row.RowType == DataControlRowType.Header)

{

e.Row.Attributes.Add("style", "background:#9999FFcolor:#FFFFFFfont-size:14px")

}

else

{

e.Row.Attributes.Add("style", "background:#FFF")

}

}

</script>

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<title>为 GridView 添加多层表头</title>

</head>

<body>

<form id="Form1" runat="server">

<asp:GridView ID="GridView1" runat="server" CellSpacing="1" CellPadding="3" Font-Size="12px"

Width="600px" BackColor="#000000" BorderWidth="0" OnRowDataBound="GridView1_RowDataBound"

OnRowCreated="GridView1_RowCreated">

</asp:GridView>

</form>

</body>

</html>

首先了解一下JSF中DataTable的渲染方式:DataTable--<Header UIComponent

--<ChildrenList<HtmlColumn

----<HtmlColumn

------<HeaderUIComponent

----<ChildrenList<UIComponent

因此,要在后台变更DataTable的状态,可以用dt.setHeader(UIComponent)设置DataTable的表头,然后可以往dt.getChildren()中添加HtmlColumn类型的列,同样,列中也可以由Header和Children组成。

代码实现如下:

private void initialReportTable(List<ExcelReport reportList) {

dt.getChildren().clear()

for (ExcelReport report : reportList) {

HtmlColumn column = new HtmlColumn()

HtmlOutputText header = new HtmlOutputText()

header.setValueExpression("value",

getValueExpression("#{rmaReport.captions.c"

+ report.getPosition() + "}"))

column.setHeader(header)

HtmlOutputText value = new HtmlOutputText()

String ve = getVEString(report)

System.out.println(report.getCaption() + " : " + ve)

value.setValueExpression("value", getValueExpression(ve))

column.getChildren().add(value)

您好,您这样:

protected void Page_Load(object sender, EventArgs e)

{

if (!IsPostBack)

{

GridView1.DataSource = FormatDT()

GridView1.DataBind()

}

}

protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)

{

switch (e.Row.RowType)

{

//页头

case DataControlRowType.Header:

//第一行表头

TableCellCollection tcHeader = e.Row.Cells

tcHeader.Clear()

tcHeader.Add(new TableHeaderCell())

tcHeader[0].Attributes.Add("bgcolor", "#8E8E8E")

tcHeader[0].Attributes.Add("rowspan", "0")//跨Row

tcHeader[0].Attributes.Add("colspan", "9")//跨Column

tcHeader[0].Text = "全部信息</tr><tr>"

//第二行表头

tcHeader.Add(new TableHeaderCell())

tcHeader[1].Attributes.Add("bgcolor", "#008A23")

tcHeader[1].Text = "身份z号码"

tcHeader.Add(new TableHeaderCell())

tcHeader[2].Text = "基本信息"

tcHeader[2].Attributes.Add("bgcolor", "#005EBB")

tcHeader[2].Attributes.Add("colspan", "3")

tcHeader.Add(new TableHeaderCell())

tcHeader[3].Text = "福利"

tcHeader[3].Attributes.Add("bgcolor", "#008A23")

tcHeader[3].Attributes.Add("colspan", "2")

tcHeader.Add(new TableHeaderCell())

tcHeader[4].Text = "应发合计"

tcHeader[4].Attributes.Add("bgcolor", "#008A23")

tcHeader.Add(new TableHeaderCell())

tcHeader[5].Text = "联系方式</tr><tr>"

tcHeader[5].Attributes.Add("bgcolor", "#005EBB")

tcHeader[5].Attributes.Add("colspan", "2")

//第三行表头

tcHeader.Add(new TableHeaderCell())

tcHeader[6].Text = "身份z号码"

tcHeader.Add(new TableHeaderCell())

tcHeader[7].Text = "姓名"

tcHeader.Add(new TableHeaderCell())

tcHeader[8].Text = "出生日期"

tcHeader.Add(new TableHeaderCell())

tcHeader[9].Text = "性别"

tcHeader.Add(new TableHeaderCell())

tcHeader[10].Text = "基本工资"

tcHeader.Add(new TableHeaderCell())

tcHeader[11].Text = "奖金"

tcHeader.Add(new TableHeaderCell())

tcHeader[12].Text = "应发合计"

tcHeader.Add(new TableHeaderCell())

tcHeader[13].Text = "家庭住址"

tcHeader.Add(new TableHeaderCell())

tcHeader[14].Text = "邮政编码"

break

//数据行 内容自适应 不换行

case DataControlRowType.DataRow:

TableCellCollection cells1 = e.Row.Cells

for (int i = 0i <cells1.Counti++)

{

cells1[i].Wrap = false//设置此项切记 不要设置前台GridView宽度

}

break

}

}

//创建DataTable

protected DataTable CreateDT()

{

DataTable tblDatas = new DataTable("Datas")

//序号列

//tblDatas.Columns.Add("ID", Type.GetType("System.Int32"))

//tblDatas.Columns[0].AutoIncrement = true

//tblDatas.Columns[0].AutoIncrementSeed = 1

//tblDatas.Columns[0].AutoIncrementStep = 1

//数据列

tblDatas.Columns.Add("身份z号码", Type.GetType("System.String"))

tblDatas.Columns.Add("姓名", Type.GetType("System.String"))

tblDatas.Columns.Add("出生日期", Type.GetType("System.String"))

tblDatas.Columns.Add("性别", Type.GetType("System.String"))

tblDatas.Columns.Add("基本工资", Type.GetType("System.Decimal"))

tblDatas.Columns.Add("奖金", Type.GetType("System.Decimal"))

//统计列开始

tblDatas.Columns.Add("应发合计", Type.GetType("System.String"), "基本工资+奖金")

//统计列结束

tblDatas.Columns.Add("家庭住址", Type.GetType("System.String"))

tblDatas.Columns.Add("邮政编码", Type.GetType("System.String"))

tblDatas.Rows.Add(new object[] { null, "张三", "1982", "0", 3000, 1000, null, "深圳市", "518000" })

tblDatas.Rows.Add(new object[] { null, "李四", "1983", "1", 3500, 1200, null, "深圳市", "518000" })

tblDatas.Rows.Add(new object[] { null, "王五", "1984", "1", 4000, 1300, null, "深圳市", "518000" })

tblDatas.Rows.Add(new object[] { null, "赵六", "1985", "0", 5000, 1400, null, "深圳市", "518000" })

tblDatas.Rows.Add(new object[] { null, "牛七", "1986", "1", 6000, 1500, null, "深圳市", "518000" })

return tblDatas

}

//转换DataTable中的数据 用于逻辑处理相应的数据 显示

protected DataTable FormatDT()

{

DataTable dt1 = CreateDT()

//容错处理 用于不确定 自动产生的列

if (dt1.Columns.Contains("性别"))

{

foreach (DataRow dr in dt1.Rows)

{

dr["性别"] = (dr["性别"].ToString() == "0") ? "女" : "男"

}

}

return dt1

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11387865.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-15
下一篇2023-05-15

发表评论

登录后才能评论

评论列表(0条)

    保存