先看效果图:
今天研究了一下Gridview合并单元格,自己也试着写了一下,上面是效果图,合并相同的行和相同的列,贴出来给大家分享一下,不足地方希望大家提出来,Demo依然上次资源,希望和大家一起进步.......
下面看一下我实现的过程吧:
首先,我写的Demo里面把合并行和合并列(值相同)的方法进行重载,分为模板列和非模板列编辑的两张情况.
代码如下:
1.GridView合并单元格.aspx 展示页面
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="GridView合并单元格.aspx.cs" Inherits="MyGrvTestPrj._Default" %>
<!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>GridView合并单元格</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GrvInfo" runat="server" AllowPaging="True" GridLines="None"
AutoGenerateColumns="False" Width="841px" BackColor="White" BorderColor="White" BorderWidth="2px"
CellPadding="3" CellSpacing="1" ondatabound="GrvInfo_DataBound" BorderStyle="Ridge">
<Columns>
<asp:BoundField DataField="StuNo" HeaderText="学生编号" SortExpression="StuNo" />
<asp:BoundField DataField="StuName" HeaderText="学生姓名" SortExpression="StuName" />
<asp:BoundField DataField="StuAge" HeaderText="学生年龄" SortExpression="StuAge" />
<asp:TemplateField HeaderText="学生部门" SortExpression="StuDepartment">
<ItemTemplate>
<asp:Label ID="lblStuDepartment" runat="server" Text='<%# Eval("StuDepartment") %>'></asp:Label>
</ItemTemplate>
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" />
</asp:TemplateField>
<asp:TemplateField HeaderText="学生职位" SortExpression="StuManager">
<ItemTemplate>
<asp:Label ID="lblStuManager" runat="server" Text='<%# Eval("StuManager") %>'></asp:Label>
</ItemTemplate>
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" />
</asp:TemplateField>
<asp:TemplateField HeaderText="出生地点" SortExpression="StuHome">
<ItemTemplate>
<asp:Label ID="lblStuHome" runat="server" Text='<%# Eval("StuHome") %>'></asp:Label>
</ItemTemplate>
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" />
</asp:TemplateField>
<asp:TemplateField HeaderText="居住地点" SortExpression="StuWohnort">
<ItemTemplate>
<asp:Label ID="lblStuWohnort" runat="server" Text='<%# Eval("StuWohnort") %>'></asp:Label>
</ItemTemplate>
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" />
</asp:TemplateField>
<asp:TemplateField HeaderText="开始时间--结束时间" SortExpression="StuBeginTime">
<ItemTemplate>
<asp:Label ID="lblStuTime" runat="server" Text='<%#GetTotal(Eval("StuBeginTime"),Eval("StuEndTime")) %>'></asp:Label>
<!--<asp:Label ID="lblStuTime1" runat="server" Text='<%#string.Format("{0}--{1}",Eval("StuBeginTime"),Eval("StuEndTime")) %>'></asp:Label>-->
</ItemTemplate>
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" />
</asp:TemplateField>
</Columns>
<RowStyle BackColor="#DEDFDE" ForeColor="Black" HorizontalAlign="Center"
BorderStyle="Solid" BorderColor="Black" BorderWidth="2px" />
<FooterStyle BackColor="#C6C3C6" ForeColor="Black" />
<PagerStyle ForeColor="Black" HorizontalAlign="Right" BackColor="#C6C3C6" />
<SelectedRowStyle BackColor="#9471DE" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#4A3C8C" Font-Bold="True" ForeColor="#E7E7FF" />
</asp:GridView>
</div>
</form>
</body>
</html>
2.GridView合并单元格.aspx.cs 后台操作代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace MyGrvTestPrj
{
public partial class _Default : System.Web.UI.Page
{
#region Attribute
#endregion
#region Page_Load
/// <summary>
/// 页面加载事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
this.GrvInfo.DataSource = new List<StuInfo>()
{
new StuInfo(){StuNo="Stu001",StuName="张三",StuAge=18,StuDepartment="网络部",StuManager="主管",StuHome="江苏宿迁",StuWohnort="江苏苏州",StuBeginTime="2011-01-01",StuEndTime="2011-02-28"},
new StuInfo(){StuNo="Stu002",StuName="李四",StuAge=19,StuDepartment="网络部",StuManager="技术人员",StuHome="江苏宿迁",StuWohnort="江苏宿迁",StuBeginTime="2011-03-01",StuEndTime="2011-04-30"},
new StuInfo(){StuNo="Stu003",StuName="王五",StuAge=20,StuDepartment="网络部",StuManager="技术人员",StuHome="江苏宿迁",StuWohnort="江苏宿迁",StuBeginTime="2011-05-01",StuEndTime="2011-06-30"},
new StuInfo(){StuNo="Stu004",StuName="赵六",StuAge=21,StuDepartment="销售部",StuManager="主管",StuHome="江苏南京",StuWohnort="江苏苏州",StuBeginTime="2011-07-01",StuEndTime="2011-08-31"},
new StuInfo(){StuNo="Stu005",StuName="钱七",StuAge=22,StuDepartment="销售部",StuManager="销售人员",StuHome="江苏南京",StuWohnort="江苏南京",StuBeginTime="2011-09-01",StuEndTime="2011-10-31"},
new StuInfo(){StuNo="Stu006",StuName="王八",StuAge=23,StuDepartment="销售部",StuManager="销售人员",StuHome="江苏南京",StuWohnort="江苏南京",StuBeginTime="2011-11-01",StuEndTime="2011-12-31"},
};
this.GrvInfo.DataBind();
}
}
#endregion
#region Function
/// <summary>
/// 拼接字符串(显示的字符串日期)
/// </summary>
/// <param name="obj1"></param>
/// <param name="obj2"></param>
/// <returns></returns>
protected string GetTotal(object obj1, object obj2)
{
return obj1.ToString() + "--" + obj2.ToString();
}
#endregion
#region Event
/// <summary>
/// 控件被数据绑定后触发()
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void GrvInfo_DataBound(object sender, EventArgs e)
{
//合并行
CommonClass.UnitRow(GrvInfo, 3, "lblStuDepartment");
CommonClass.UnitRow(GrvInfo, 4, "lblStuManager");
//合并列
CommonClass.UnitCell(GrvInfo, 5, "lblStuHome", "lblStuWohnort");
}
#endregion
}
}
3.CommonClass.cs 公共调用的类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;
namespace MyGrvTestPrj
{
/// <summary>
/// 公共类合并Grv单元格
/// </summary>
public class CommonClass
{
#region 合并行(相同值)-普通列
/// <summary>
/// 合并行(普通列)
/// </summary>
/// <param name=“gv”>所对应的GridView对象</param>
/// <param name=“columnIndex”>所对应要合并的列的索引</param>
public static void UnitRow(GridView gv, int columnIndex)
{
int i;
string lastType;
int lastCell;
if (gv.Rows.Count > 0)
{
lastType = gv.Rows[0].Cells[columnIndex].Text;
gv.Rows[0].Cells[columnIndex].RowSpan = 1;
lastCell = 0;
for (i = 1; i < gv.Rows.Count; i++)
{
if (gv.Rows[i].Cells[columnIndex].Text == lastType)
{
gv.Rows[i].Cells[columnIndex].Visible = false;
gv.Rows[lastCell].Cells[columnIndex].RowSpan++;
}
else
{
lastType = gv.Rows[i].Cells[columnIndex].Text;
lastCell = i;
gv.Rows[i].Cells[columnIndex].RowSpan = 1;
}
}
}
}
#endregion
#region 合并行(相同值)-模板列
/// <summary>
/// 合并行(模板列)
/// </summary>
/// <param name=“gv”>所对应的GridView对象</param>
/// <param name=“columnIndex”>所对应要合并的列的索引</param>
/// <param name=“lblName”>模板列里面Lable的Id</param>
public static void UnitRow(GridView gv, int columnIndex, string lblName)
{
int i;
string lastType;
int lastCell;
if (gv.Rows.Count > 0)
{
lastType = (gv.Rows[0].Cells[columnIndex].FindControl(lblName) as Label).Text;
gv.Rows[0].Cells[columnIndex].RowSpan = 1;
lastCell = 0;
for (i = 1; i < gv.Rows.Count; i++)
{
if ((gv.Rows[i].Cells[columnIndex].FindControl(lblName) as Label).Text == lastType)
{
gv.Rows[i].Cells[columnIndex].Visible = false;
gv.Rows[lastCell].Cells[columnIndex].RowSpan++;
}
else
{
lastType = (gv.Rows[i].Cells[columnIndex].FindControl(lblName) as Label).Text;
lastCell = i;
gv.Rows[i].Cells[columnIndex].RowSpan = 1;
}
}
}
}
#endregion
#region 合并列(相同值)-普通列
/// <summary>
/// 合并列(普通列)
/// </summary>
/// <param name="gv">所对应的GridView对象</param>
/// <param name="columnIndex">所对应要合并的列的索引</param>
public static void UnitCell(GridView gv,int columnIndex)
{
int i;
string lastType;
if (gv.Rows.Count > 0)
{
for (i = 1; i < gv.Rows.Count; i++)
{
lastType = gv.Rows[i].Cells[columnIndex].Text;
gv.Rows[i].Cells[columnIndex].ColumnSpan = 1;
if (gv.Rows[i].Cells[columnIndex+1].Text == lastType)
{
gv.Rows[i].Cells[columnIndex+1].Visible = false;
gv.Rows[i].Cells[columnIndex].ColumnSpan++;
}
else
{
lastType = gv.Rows[i].Cells[columnIndex].Text;
gv.Rows[i].Cells[columnIndex].ColumnSpan = 1;
}
}
}
}
#endregion
#region 合并列(相同值)-模板列
/// <summary>
/// 合并行(模板列)
/// </summary>
/// <param name=“gv”>所对应的GridView对象</param>
/// <param name=“columnIndex”>所对应要合并的列的索引</param>
/// <param name=“lblName1”>模板列里面Lable1的Id</param>
/// /// <param name=“lblName1”>模板列里面Lable2的Id</param>
public static void UnitCell(GridView gv, int columnIndex, string lblName1,string lblName2)
{
int i;
string lastType;
if (gv.Rows.Count > 0)
{
for (i = 0; i < gv.Rows.Count; i++)
{
lastType = (gv.Rows[i].Cells[columnIndex].FindControl(lblName1) as Label).Text;
gv.Rows[i].Cells[columnIndex].ColumnSpan = 1;
if ((gv.Rows[i].Cells[columnIndex + 1].FindControl(lblName2) as Label).Text == lastType)
{
gv.Rows[i].Cells[columnIndex+1].Visible = false;
gv.Rows[i].Cells[columnIndex].ColumnSpan++;
}
else
{
lastType = (gv.Rows[i].Cells[columnIndex].FindControl(lblName1) as Label).Text;
gv.Rows[i].Cells[columnIndex].ColumnSpan = 1;
}
}
}
}
#endregion
}
}
4.StuInfo.cs 学生信息类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace MyGrvTestPrj
{
/// <summary>
/// 测试数据类
/// </summary>
public class StuInfo
{
/// <summary>
/// 学生编号
/// </summary>
public string StuNo { set; get; }
/// <summary>
/// 学生姓名
/// </summary>
public string StuName { set; get; }
/// <summary>
/// 学生年龄
/// </summary>
public int StuAge { set; get; }
/// <summary>
/// 学生部门
/// </summary>
public string StuDepartment { set; get; }
/// <summary>
/// 学生职位
/// </summary>
public string StuManager { set; get; }
/// <summary>
/// 出生地
/// </summary>
public string StuHome { set; get; }
/// <summary>
/// 居住地
/// </summary>
public string StuWohnort { set; get; }
/// <summary>
/// 开始时间
/// </summary>
public string StuBeginTime { set; get; }
/// <summary>
/// 结束时间
/// </summary>
public string StuEndTime { set; get; }
}
}
以上就是我实现的方法,封装好了,可以直接使用,有不足的地方还希望大家能够指出,继续改进,做得更好, 以求不断的进步,O(∩_∩)O谢谢......圣诞快乐,祝大家生活工作愉快!!!!