- 浏览: 341983 次
- 性别:
- 来自: 武汉
最新评论
-
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 4687使用动软.net代码生成工具(V2.4.1)在建立好数据库 ... -
asp.net解决session丢失问题
2010-05-05 16:01 1776在asp.net里面,很多时候使用session来保存一些对象 ... -
database数据表转成JSON
2010-01-26 10:50 1603第一个发送到前台要eval一下.转换成JS的数组 第二个转换 ... -
String.Format格式说明
2009-12-28 11:04 1444将指定的String 中的每个格式项替换为相应对象的值的文本等 ... -
模态窗口
2009-12-05 10:55 1844模态窗口 .模态窗口的打开,model window o ... -
net打开子窗口传参数给父窗口
2009-11-02 12:58 1352说明:点"查询"按钮打开子窗口,以GRID ... -
AJAX GridView
2009-10-29 20:01 1479http://programming.top54u.com/S ... -
asp.net生成高清晰缩略图
2009-10-21 21:25 1797#region 图像处理 ... -
Asp.net 自动发送邮件的方法
2009-09-10 09:54 2102Asp.net 自动发送邮件的方法 今天有一个模块需要自动 ... -
截取一定数量的字符串
2009-09-10 09:52 9921/**//// <summary> 2 ... -
asp.net的sql防注入
2009-09-10 09:47 1659/// <summary> /// 过滤标记 ... -
ASP.NET常用语句1--20条
2009-09-07 11:54 10361.//弹出对话框.点击转向指定页面 Response.Wri ... -
存储过程调用另一种方式
2009-09-02 11:32 940public static String AdminUs ... -
存储过程调用一种方式
2009-09-02 11:29 837public static String Is_UP_cus ... -
Asp.net 免费主机 免费空间
2009-07-16 17:16 1843Asp.net 免费主机 免费空间 http: ... -
Asp.net 打印 页面 局部页面 动态控制
2009-07-16 17:07 3112Asp.net 打印 页面 局部页面 动态控制 1. ... -
Asp.net 打印web 网页 如何不显示 网址 页码
2009-07-16 16:11 36771.对IE浏览器进行设置 文件-〉页面设置-〉将里面的页眉 ... -
多附件上传源码
2009-07-09 10:34 1807多附件上传源码 /***************** ... -
在ASP.NET网站中实现带列表的视频播放(2)
2009-07-09 10:32 1291视频播放模块代码: <table cellspaci ... -
在ASP.NET网站中实现带列表的视频播放
2009-07-09 10:23 2257在ASP.NET网站中实现带列表的视频播放 方法:用 ...
相关推荐
总结来说,GridView单元格合并是.NET Web开发中的一个重要技巧,它能够帮助我们更有效地展示复杂的数据结构,提供更清晰的视图。熟练掌握这一技术,可以提升用户体验,让数据展示更加专业和直观。
2) 数据绑定后处理:在页面完全加载后,使用JavaScript或jQuery对GridView的HTML进行操作,合并相同的表头单元格。 4. 示例代码: 以下是一个简单的服务器端实现示例: ```csharp protected void GridView1_...
本教程将详细解释如何在WPF的GridView中实现单元格合并,这对于创建复杂的报表或者进行数据分组展示非常有用。我们将使用Visual Studio 2017作为开发环境。 ### 1. 创建WPF项目 首先,打开Visual Studio 2017,...
而`cellOtherNum`数组则包含了一组索引,指示了与`cellNum`单元格相关的其他单元格,这些单元格在合并过程中也可能会被隐藏或其行跨度会被调整。 #### 代码逻辑流程: 1. **初始化变量**:`i`用于遍历`gbGridView....
在标题“GridView合并单元格”中,这个话题主要探讨的是如何在GridView中实现单元格的合并。 合并GridView的单元格并非简单的HTML操作,因为GridView在服务器端自动生成表格(HTML `<table>`)。实际上,我们是在...
在处理表格数据时,有时我们希望合并具有相同内容的单元格以提高数据可读性和美观性。本篇将详细介绍如何在C#语言环境下,使用这两种控件来实现相同内容单元格的合并。 首先,GridView是最常见的数据绑定控件,适用...
比如,通过SQL的GROUP BY语句可以将相同数据聚合,从而减少在前端进行合并的需要。 最后,关于源码,"DataGridView合并单元格(纵向合并及横向合并).txt"文件很可能是包含了实现上述功能的C#代码示例。你可以打开...
合并单元格通常是为了创建更清晰的布局,例如在列头中合并多列以表示一个总标题,或者在数据行中合并某些具有相同值的单元格。以下是一个关于如何在ASP.NET GridView中实现单元格合并的详细步骤: 1. **创建...
但如果我们想要合并某些单元格,例如合并相同值的列或者按照一定规则合并,就需要自定义模板字段并利用一些技巧来实现。 1. **单元格合并的原理**: GridView单元格的合并通常通过两种方式实现:后台代码控制和...
在DevExpress GridControl中,单元格合并通常用于创建具有复杂布局的表格,比如合并相同值的行或列,或者为了美观和数据组织的需要。以下是实现这一功能的关键步骤和知识点: 1. **设置MergeStrategy**: 要开启...
单元格合并通常用于当一组数据需要跨多行或多列显示时,例如,汇总信息或者创建带有标题的复合单元格。 首先,让我们深入理解GridControl的基础知识。WPF中的DataGrid或GridControl是用于显示和编辑结构化数据的...
在DevExpress的GridControl中,合并单元格是一种常见的需求,它能帮助我们更好地组织和展示数据。GridControl提供了多种方法来实现单元格的合并,这些方法适用于不同的场景和需求。以下将详细阐述如何在DevExpress ...
本文将深入探讨如何在GridControl中根据特定条件进行单元格的合并,以此来优化数据展示,提高用户体验。 GridControl是DevExpress提供的一种可视化组件,常用于构建数据密集型应用程序。它支持丰富的功能,如排序、...
当我们需要在GridView中呈现某些特定的数据时,可能会遇到需要合并单元格的情况,这通常是为了提高数据的可读性或者美化布局。在标题“合并GridView里面的单元格”中提到的问题,我们可以理解为在GridView的行或列上...
合并`GridView`中的单元格是一项常见的需求,尤其当需要对相同的数据行进行组合以减少重复信息时。本文将详细介绍如何实现这一功能。 #### 方法详解 `DoUniteGroupRowsGrid`方法是一个用于合并`GridView`中指定列...
6. **文档资源**:压缩包中的"asp.net_合并GridView中某列相同信息的行(单元格).doc"文档可能提供了详细的示例代码和步骤解释,建议查阅该文档以获取更具体的实现细节。 通过以上步骤,我们可以实现GridView中...
合并table的行不仅是一项实用的技术,也是提升数据展示质量和用户界面友好度的关键手段。通过深入理解其实现原理,结合具体的业务场景进行灵活应用和优化,我们可以创造出更加高效、美观的Web应用程序。
标题中的“动态的合并单元格”指的是在编程中实现表格(如GridView)中单元格的动态合并功能。这种技术常用于数据展示,特别是在处理分类或分组数据时,可以更清晰地呈现信息结构。描述中提到,通过这种方法,编程...