拓展方法之拓展GridView,使之具备合并单元格的能力

拓展类

/*
 *  我们合并第1列的值姓名..  GirdView索引是从0开始的所以ColumnIndex=0 性别肯定和姓名对应的
    可以是用Colunmns="" 这个属性来指定哪个列的合并方式和 ColumnIndex指定的列相同  多个用 ","隔开比如 Colunmns="2,3,4,5"这种方式
    如果GridView中使用了模板列 则除了需要指定ColumnIndex外还需要添加ID和PropertyName属性
    如 new {ColumnIndex=0,ID="lblName",PropertyName="Text",Columns="1" }
    ID 表示模板列的控件名称 PropertyName 表示值来自于控件的哪个属性.  
    注:暂时只能指定普通属性如Text 或Value ;SelectedItem.Value 这种属性需要修改部分代码  也不能包含容器控件 修改部分代码可以支持容器控件
 */

public static class GridViewExtensions
{
    /// <summary>
    ///  GridView行合并
    /// </summary>
    /// <param name="gridView"></param>
    /// <param name="field">合并参数(匿名类型)
    /// ColumnIndex:要合并行的索引 (以0开始,必须指定)
    /// ColumnControlID(可选):如果该行为模板行则必须指定 
    /// PropertyName:根据ID属性 默认值为Text
    /// Colums:(string类型)表示额外的行合并方式和ColumnIndex一样(多个使用逗号隔开,如Colums="5,6,7,8")
    /// 例:
    /// 合并第一行(第一行为模板行),绑定的一个Label名称为lblName  根据Text属性值合并  第6行方式和第一行相同
    /// new {ColumnIndex=0,ColumnControlID="lblName",PropertyName="Text",Columns="5"}
    /// </param>
    public static GridView RowSpan(this GridView gridView, object field)
    {
        Dictionary<string, string> rowDictionary = ObjectLoadDictionary(field);
        int columnIndex = int.Parse(rowDictionary["ColumnIndex"]);
        string columnName = rowDictionary["ColumnControlID"];
        string propertyName = rowDictionary["PropertyName"];
        string columns = rowDictionary["Columns"];
        for (var i = 0; i < gridView.Rows.Count; i++)
        {

            int rowSpanCount = 1;
            for (int j = i + 1; j < gridView.Rows.Count; j++)
            {
                //绑定行合并处理
                if (string.IsNullOrEmpty(columnName))
                {
                    //比较2行的值是否相同
                    if (gridView.Rows[i].Cells[columnIndex].Text == gridView.Rows[j].Cells[columnIndex].Text)
                    {
                        //合并行的数量+1
                        rowSpanCount++;
                        //隐藏相同的行
                        gridView.Rows[j].Cells[columnIndex].Visible = false;
                        if (!string.IsNullOrEmpty(columns))
                        {
                            columns.Split(',').ToList<string>().ForEach(c => gridView.Rows[j].Cells[int.Parse(c)].Visible = false);
                        }
                    }
                    else
                    {
                        break;
                    }
                }
                else
                {
                    //模板行的合并处理
                    if (GetPropertyValue(gridView.Rows[i].Cells[columnIndex].FindControl(columnName), propertyName).ToString() == GetPropertyValue(gridView.Rows[j].Cells[columnIndex].FindControl(columnName), propertyName).ToString())
                    {
                        rowSpanCount++;
                        //隐藏相同的行
                        gridView.Rows[j].Cells[columnIndex].Visible = false;
                        if (!string.IsNullOrEmpty(columns))
                        {

                            columns.Split(',').ToList<string>().ForEach(c => gridView.Rows[j].Cells[int.Parse(c)].Visible = false);
                        }
                    }
                    else
                    {
                        break;
                    }
                }
            }
            if (rowSpanCount > 1)
            {
                //行合并
                gridView.Rows[i].Cells[columnIndex].RowSpan = rowSpanCount;
                //判断是否有额外的行需要合并
                if (!string.IsNullOrEmpty(columns))
                {
                    //额外的行合并
                    columns.Split(',').ToList<string>().ForEach(c => gridView.Rows[i].Cells[int.Parse(c)].RowSpan = rowSpanCount);
                }
                i = i + rowSpanCount - 1;
            }


        }
        return gridView;
    }

    private static Dictionary<string, string> ObjectLoadDictionary(object fields)
    {
        Dictionary<string, string> resultDictionary = new Dictionary<string, string>();
        PropertyInfo[] property = fields.GetType().GetProperties(BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.GetProperty);
        foreach (PropertyInfo tempProperty in property)
        {
            resultDictionary.Add(tempProperty.Name, tempProperty.GetValue(fields, null).ToString());
        }
        //指定默认值
        if (!resultDictionary.Keys.Contains("ColumnIndex"))
        {
            throw new Exception("未指定要合并行的索引 ColumnIndex 属性!");
        }
        if (!resultDictionary.Keys.Contains("ColumnControlID"))
        {
            resultDictionary.Add("ColumnControlID", null);
        }

        if (!resultDictionary.Keys.Contains("PropertyName"))
        {
            resultDictionary.Add("PropertyName", "Text");
        }

        if (!resultDictionary.Keys.Contains("Columns"))
        {
            resultDictionary.Add("Columns", null);
        }




        return resultDictionary;
    }

    /// <summary>
    ///  获取一个对象的一个属性..
    /// </summary>
    /// <param name="obj"></param>
    /// <param name="PropertyName">属性名称</param>
    /// <returns>属性的值,  如果无法获取则返回null</returns>
    private static object GetPropertyValue(object obj, string PropertyName)
    {
        PropertyInfo property = obj.GetType().GetProperty(PropertyName);
        return property.GetValue(obj, null);
    }
}

测试页面前台

<%@ 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">
    </asp:GridView>
    <asp:GridView ID="GridView2" runat="server" BackColor="White" BorderColor="#3366CC" 
            BorderStyle="None" BorderWidth="1px" CellPadding="4">
        <RowStyle BackColor="White" ForeColor="#003399" />
        <FooterStyle BackColor="#99CCCC" ForeColor="#003399" />
        <PagerStyle BackColor="#99CCCC" ForeColor="#003399" HorizontalAlign="Left" />
        <SelectedRowStyle BackColor="#009999" Font-Bold="True" ForeColor="#CCFF99" />
        <HeaderStyle BackColor="#003399" Font-Bold="True" ForeColor="#CCCCFF" />
    </asp:GridView>
     <asp:GridView ID="GridView3" runat="server" BackColor="White" BorderColor="#3366CC" 
            BorderStyle="None" BorderWidth="1px" CellPadding="4">
        <RowStyle BackColor="White" ForeColor="#003399" />
        <FooterStyle BackColor="#99CCCC" ForeColor="#003399" />
        <PagerStyle BackColor="#99CCCC" ForeColor="#003399" HorizontalAlign="Left" />
        <SelectedRowStyle BackColor="#009999" Font-Bold="True" ForeColor="#CCFF99" />
        <HeaderStyle BackColor="#003399" Font-Bold="True" ForeColor="#CCCCFF" />
    </asp:GridView>
    </div>
    </form>
</body>
</html>
测试页面后台

var s = new[] { 
                new { 姓名 = "张三", 性别 = "男", 语文 = 86f, 数学 = 90f, 学期 = "第一学期" },  
                new { 姓名 = "张三", 性别 = "男", 语文 = 89f, 数学 = 98f, 学期 = "第二学期" }, 
                new { 姓名 = "李四", 性别 = "男", 语文 = 89f, 数学 = 64f, 学期 = "第一学期" },  
                new { 姓名 = "李四", 性别 = "男", 语文 = 75f, 数学 = 64f, 学期 = "第二学期" },
                new { 姓名 = "王五", 性别 = "男", 语文 = 89f, 数学 = 64f, 学期 = "第一学期" },  
                new { 姓名 = "王五", 性别 = "男", 语文 = 63f, 数学 = 93f, 学期 = "第二学期" }
            };
        this.GridView1.DataSource = s;
        this.GridView1.DataBind();
        this.GridView1.RowSpan(new { ColumnIndex = 0, Columns = "1" });

        this.GridView2.DataSource = s;
        this.GridView2.DataBind();
        this.GridView2.RowSpan(new { ColumnIndex = 0, Columns = "1" });
        this.GridView2.RowSpan(new { ColumnIndex = 2 });


        this.GridView3.DataSource = s;
        this.GridView3.DataBind();
        this.GridView3.RowSpan(new { ColumnIndex = 0, Columns = "1" }).RowSpan(new { ColumnIndex = 2 }).RowSpan(new { ColumnIndex = 3 });

知识共享许可协议
《拓展方法之拓展GridView,使之具备合并单元格的能力》常伟华 创作。
采用 知识共享 署名-相同方式共享 3.0 中国大陆 许可协议进行许可。
相邻依据:发表时间
  • 多说评论
  • 签名
  • 新浪微博
  • 默认评论
  • Tab Header 5

0 条评论 / 点击此处发表评论

Tab Content 5

开发技术


开发平台和工具

sitemap     172.24ms