第四篇博客:Gridview合并单元格(合并行和列)

           先看效果图: 

            今天研究了一下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谢谢......圣诞快乐,祝大家生活工作愉快!!!!

 

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值