- 浏览: 336165 次
- 性别:
- 来自: 武汉
最新评论
-
ynymf:
错位问题看这里:http://www.cnblogs.com/ ...
EXTJS制作的嵌套表格实例(点击一行,展开下面的子表) -
xlshlr:
code.php在哪????貌似么有找到这个文件
ExtJS带验证码登录框[新增回车提交] -
langfeng123ac:
二货,这种写法本地又不行,本地有图片,服务器上又没图片。。浪费 ...
JQUERY+ASP.NET的AJAX文件上传(含Demo) -
553718707:
楼主有没有解决方法啊?
EXTJS制作的嵌套表格实例(点击一行,展开下面的子表) -
553718707:
这个代码对于,子表格的列数很多的时候会出现子表格的列与数据行错 ...
EXTJS制作的嵌套表格实例(点击一行,展开下面的子表)
大家GridView都用的比较多吧.. 有没遇到单元格需要合并的需求..
单元格合并原理其实很简单,就是逐行判断要合并的单元格里的值是否和上一行的相同,要是相同的话就合并,不同的话就接着判断
我们可以通过扩展方法为GridView添加单元合并
public static class GridViewExtensions
{
/// <summary>
/// GridView行合并
/// </summary>
/// <param name="gridView"></param>
/// <param name="field">合并参数(匿名类型)
/// ColumnIndex:要合并行的索引 (以0开始,必须指定)
/// ID(可选):如果该行为模板行则必须指定
/// PropertyName:根据ID属性 默认值为Text
/// Colums:(string类型)表示额外的行合并方式和ColumnIndex一样(多个使用逗号隔开,如Colums="5,6,7,8")
/// 例:
/// 合并第一行(第一行为模板行),绑定的一个Label名称为lblName 根据Text属性值合并 第6行方式和第一行相同
/// new {ColumnIndex=0,ID="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["ColumnName"];
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) == GetPropertyValue(gridView.Rows[j].Cells[columnIndex].FindControl(columnName), propertyName))
{
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("ColumnName"))
{
resultDictionary.Add("ColumnName", 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);
}
}
我为GridView 创建了个RowSpan的方法 . 有一个object 参数
为什要定义object 参数 源于ASP.NET MVC 的Routing 组件配置规则 感觉这种方式很不错..所以使用了这种方式来进行.这个扩展方法的使用方式很简单
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" });
我们合并第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 这种属性需要修改部分代码 也不能包含容器控件 修改部分代码可以支持容器控件
效果图
姓名 性别 语文 数学 学期
张三 男 86 90 第一学期
89 98 第二学期
李四 男 89 64 第一学期
75 64 第二学期
王五 男 89 64 第一学期
63 93 第二学期
合并姓名和语文相同的分数
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.GridView1.RowSpan(new { ColumnIndex = 2 });
姓名 性别 语文 数学 学期
张三 男 86 90 第一学期
89 98 第二学期
李四 男 64 第一学期
75 64 第二学期
王五 男 89 64 第一学期
63 93 第二学期
可以使用这种方式
this.GridView1.RowSpan(new { ColumnIndex = 0, Columns = "1" }).RowSpan(new { ColumnIndex = 2 }).RowSpan(new { ColumnIndex = 3 });
姓名 性别 语文 数学 学期
张三 男 86 90 第一学期
89 98 第二学期
李四 男 64 第一学期
75 第二学期
王五 男 89 第一学期
63 93 第二学期
还有什么额外的参数配置 大家可以提出来 我进行改进.
效率问题 我可以考虑使用Lambda表达式树动态创建Lambda表达式的效率
Lambda表达式调用的效率差别可以看
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/LIUMRZY/archive/2009/06/06/4246979.aspx
发表评论
-
使用动软.net代码自动生成工具的步骤
2010-05-13 17:09 4637使用动软.net代码生成工具(V2.4.1)在建立好数据库 ... -
asp.net解决session丢失问题
2010-05-05 16:01 1734在asp.net里面,很多时候使用session来保存一些对象 ... -
database数据表转成JSON
2010-01-26 10:50 1554第一个发送到前台要eval一下.转换成JS的数组 第二个转换 ... -
String.Format格式说明
2009-12-28 11:04 1382将指定的String 中的每个格式项替换为相应对象的值的文本等 ... -
模态窗口
2009-12-05 10:55 1792模态窗口 .模态窗口的打开,model window o ... -
net打开子窗口传参数给父窗口
2009-11-02 12:58 1321说明:点"查询"按钮打开子窗口,以GRID ... -
AJAX GridView
2009-10-29 20:01 1439http://programming.top54u.com/S ... -
asp.net生成高清晰缩略图
2009-10-21 21:25 1760#region 图像处理 ... -
Asp.net 自动发送邮件的方法
2009-09-10 09:54 2060Asp.net 自动发送邮件的方法 今天有一个模块需要自动 ... -
截取一定数量的字符串
2009-09-10 09:52 9501/**//// <summary> 2 ... -
asp.net的sql防注入
2009-09-10 09:47 1616/// <summary> /// 过滤标记 ... -
ASP.NET常用语句1--20条
2009-09-07 11:54 9861.//弹出对话框.点击转向指定页面 Response.Wri ... -
存储过程调用另一种方式
2009-09-02 11:32 896public static String AdminUs ... -
存储过程调用一种方式
2009-09-02 11:29 780public static String Is_UP_cus ... -
Asp.net 免费主机 免费空间
2009-07-16 17:16 1804Asp.net 免费主机 免费空间 http: ... -
Asp.net 打印 页面 局部页面 动态控制
2009-07-16 17:07 3052Asp.net 打印 页面 局部页面 动态控制 1. ... -
Asp.net 打印web 网页 如何不显示 网址 页码
2009-07-16 16:11 36121.对IE浏览器进行设置 文件-〉页面设置-〉将里面的页眉 ... -
多附件上传源码
2009-07-09 10:34 1776多附件上传源码 /***************** ... -
在ASP.NET网站中实现带列表的视频播放(2)
2009-07-09 10:32 1253视频播放模块代码: <table cellspaci ... -
在ASP.NET网站中实现带列表的视频播放
2009-07-09 10:23 2217在ASP.NET网站中实现带列表的视频播放 方法:用 ...
相关推荐
GrivView中的单元格合并, 类似于HTML中的跨行或跨列合并单元格,使GridView更方便的展示数据,已经测试过,可以使用
在做数据的绑定的时候,有时候为了需求会合并相同单元格,也有不同单元格的合并
控件使用 1、鼠标经过行的时候改变该行的样式,鼠标...{3}-总页数) <br>11、合并指定列的相邻且内容相同的单元格 使用方法(设置属性): MergeCells - 需要合并单元格的列的索引(用逗号“,”分隔)
1. 鼠标经过行时改变行的样式 2. 复合排序和排序状态提示 3.根据按钮的CommandName设置其客户端...合并指定列的相邻且内容相同的单元格 注:除了“固定指定行、指定列”仅支持IE外,其它均同时支持IE和FF
控件使用 1、鼠标经过行的时候改变该行的样式,鼠标离开行的时候恢复该行的样式 ...11、合并指定列的相邻且内容相同的单元格 使用方法(设置属性): MergeCells - 需要合并单元格的列的索引(用逗号“,”分隔)
第18章 程序应用控制 483 ...0990 合并具有相同数据表结构的查询结果 575 0991 使用DataTable进行数据检索 575 0992 使用DataView对数据进行检索和排序 576 0993 使用DataSet建立DataTable明细表 576
24 <br>0050 using关键字的用法 24 <br>0051 变量的作用域 25 <br>2.5 其他 26 <br>0052 有效使用this对象 26 <br>0053 如何声明变量 26 <br>0054 如何声明相同类型的多个变量 26 ...
9.22 动态生成包含合并单元格的表格 9.23 用键盘上下键实现表格行的上下选择 9.24 用JavaScript隐藏或显示表格列 9.25 滚动的表格 9.26 交换表的行 9.27 动态拖放表格的宽度 9.28 可输入内容的表格 9.29 可以分级的...
9.22 动态生成包含合并单元格的表格 9.23 用键盘上下键实现表格行的上下选择 9.24 用JavaScript隐藏或显示表格列 9.25 滚动的表格 9.26 交换表的行 9.27 动态拖放表格的宽度 9.28 可输入内容的表格 9.29 可以分级的...