在GRIDVIEW中合并单元格

//   <summary>  
    ///   合并GridView列中相同的行  
    ///   </summary>  
    ///   <param   name="GridView1">GridView对象</param>  
    ///   <param   name="cellNum">需要合并的列</param>  
    public static void GroupRows(GridView GridView1, int cellNum)
    {
        int i = 0, rowSpanNum = 1;
        while (i < GridView1.Rows.Count - 1)
        {
            GridViewRow gvr = GridView1.Rows[i];
            for (++i; i < GridView1.Rows.Count; i++)
            {
                GridViewRow gvrNext = GridView1.Rows[i];
                if (gvr.Cells[cellNum].Text == gvrNext.Cells[cellNum].Text)
                {
                    gvrNext.Cells[cellNum].Visible = false;
                    rowSpanNum++;
                }
                else
                {
                    gvr.Cells[cellNum].RowSpan = rowSpanNum;
                    rowSpanNum = 1;
                    break;
                }

                if (i == GridView1.Rows.Count - 1)
                {
                    gvr.Cells[cellNum].RowSpan = rowSpanNum;
                }
            }
        }
    }

    ///   <summary>  
    ///   根据条件列合并GridView列中相同的行  
    ///   </summary>  
    ///   <param   name="GridView1">GridView对象</param>  
    ///   <param   name="cellNum">需要合并的列</param>
    ///   ///   <param   name="cellNum2">条件列(根据某条件列还合并)</param>
    public static void GroupRows(GridView GridView1, int cellNum, int cellNum2)
    {
        int i = 0, rowSpanNum = 1;
        while (i < GridView1.Rows.Count - 1)
        {
            GridViewRow gvr = GridView1.Rows[i];
            for (++i; i < GridView1.Rows.Count; i++)
            {
                GridViewRow gvrNext = GridView1.Rows[i];
                if (gvr.Cells[cellNum].Text + gvr.Cells[cellNum2].Text == gvrNext.Cells[cellNum].Text + gvrNext.Cells[cellNum2].Text)
                {
                    gvrNext.Cells[cellNum].Visible = false;
                    rowSpanNum++;
                }
                else
                {
                    gvr.Cells[cellNum].RowSpan = rowSpanNum;
                    rowSpanNum = 1;
                    break;
                }

                if (i == GridView1.Rows.Count - 1)
                {
                    gvr.Cells[cellNum].RowSpan = rowSpanNum;
                }
            }
        }
    }

 

第二个方法只是在第一个方法的修改了一点点, 在判断单元格的时候,加上了一个条件列:

if (gvr.Cells[cellNum].Text + gvr.Cells[cellNum2].Text == gvrNext.Cells[cellNum].Text + gvrNext.Cells[cellNum2].Text)。当然,第二个方法还可以扩展,根据多个列的条件来合并。

 

------------------------

例程:

数据库(Sql2005)

USE [dbgang]
GO
/****** 对象: Table [dbo].[tbJiLu]    脚本日期: 08/13/2008 23:46:54 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[tbJiLu](
[intID] [int] IDENTITY(1,1) NOT NULL,
[A] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[B] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[C] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[D] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[E] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[F] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_tbJiLu] PRIMARY KEY CLUSTERED
(
[intID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF

 

前台代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_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>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
            <Columns>
                <asp:BoundField DataField="A" HeaderText="粮食属性" />
                <asp:BoundField DataField="B" HeaderText="品种" />
                <asp:BoundField DataField="C" HeaderText="货位号" />
                <asp:BoundField DataField="D" HeaderText="收购计划数量" />
                <asp:BoundField DataField="E" HeaderText="已规划数量" />
                <asp:BoundField DataField="F" HeaderText="未规划数量" />
            </Columns>
        </asp:GridView>
   
    </div>
    </form>
</body>
</html>

后台代码:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Generic;
using System.Data.Common;
using Microsoft.Practices.EnterpriseLibrary.Data;
using Microsoft.Practices.ObjectBuilder;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            Database db=DatabaseFactory.CreateDatabase();
            DbCommand cmd= db.GetSqlStringCommand("SELECT * FROM tbJiLu");
            using (IDataReader dr=db.ExecuteReader(cmd))
            {
                IList<MeiShi.tbJiLuInfo> list = MeiShi.FillDataToList<MeiShi.tbJiLuInfo>.FillDataList(dr);
                GridView1.DataSource = list;
                GridView1.DataBind();
            }
            GroupRows(this.GridView1, 0);
            GroupRows(this.GridView1, 1);
        }

    }

    //   <summary>  
    ///   合并GridView列中相同的行  
    ///   </summary>  
    ///   <param   name="GridView1">GridView对象</param>  
    ///   <param   name="cellNum">需要合并的列</param>  
    public static void GroupRows(GridView GridView1, int cellNum)
    {
        int i = 0, rowSpanNum = 1;
        while (i < GridView1.Rows.Count - 1)
        {
            GridViewRow gvr = GridView1.Rows[i];
            for (++i; i < GridView1.Rows.Count; i++)
            {
                GridViewRow gvrNext = GridView1.Rows[i];
                if (gvr.Cells[cellNum].Text == gvrNext.Cells[cellNum].Text)
                {
                    gvrNext.Cells[cellNum].Visible = false;
                    rowSpanNum++;
                }
                else
                {
                    gvr.Cells[cellNum].RowSpan = rowSpanNum;
                    rowSpanNum = 1;
                    break;
                }
                if (i == GridView1.Rows.Count - 1)
                {
                    gvr.Cells[cellNum].RowSpan = rowSpanNum;
                }
            }
        }
    }

    ///   <summary>  
    ///   根据条件列合并GridView列中相同的行  
    ///   </summary>  
    ///   <param   name="GridView1">GridView对象</param>  
    ///   <param   name="cellNum">需要合并的列</param>
    ///   ///   <param   name="cellNum2">条件列(根据某条件列还合并)</param>
    public static void GroupRows(GridView GridView1, int cellNum, int cellNum2)
    {
        int i = 0, rowSpanNum = 1;
        while (i < GridView1.Rows.Count - 1)
        {
            GridViewRow gvr = GridView1.Rows[i];
            for (++i; i < GridView1.Rows.Count; i++)
            {
                GridViewRow gvrNext = GridView1.Rows[i];
                if (gvr.Cells[cellNum].Text + gvr.Cells[cellNum2].Text == gvrNext.Cells[cellNum].Text + gvrNext.Cells[cellNum2].Text)
                {
                    gvrNext.Cells[cellNum].Visible = false;
                    rowSpanNum++;
                }
                else
                {
                    gvr.Cells[cellNum].RowSpan = rowSpanNum;
                    rowSpanNum = 1;
                    break;
                }

                if (i == GridView1.Rows.Count - 1)
                {
                    gvr.Cells[cellNum].RowSpan = rowSpanNum;
                }
            }
        }
    }


}

posted @ 2009-08-24 20:25  TOYOE  阅读(3857)  评论(0编辑  收藏  举报