GridView合并单元格(多列)

将星陨落天命难违 2012-03-29 11:09:40
不知道合并gridview单元格有没有好的方法,是多列的。
比如我有姓名、照片、性别、出生年月等多列信息,其中这四列都是要合并单元格的。现在的问题就是姓名不太可能重复,但是照片会出现这样一个问题,因为可以不上传照片,所以如果相邻的两条信息都没有上传照片的话,照片这一列就不好合并了。性别的问题更突出,比如相邻的两条信息都是男或者都是女,合并好像也比较复杂。请问有没有好一点的办法?
或者说使用telerik 的radgrid可以实现这个功能吗?


原始样式
姓名 照片 性别 出生年月 其它列1 其它列2 其它列3
A P M XXXX O1 O2 O3
A P M XXXX O4 O5 O6
A P M XXXX O7 O8 O9
B P2 F YYYY 10 11 12
B P2 F YYYY 13 14 15
B P2 F YYYY 16 17 18
需求样式
姓名 照片 性别 出生年月 其它列1 其它列2 其它列3
O1 O2 O3
A P M XXXX O4 O5 O6
O7 O8 O9
10 11 12
B P2 F YYYY 13 14 15
16 17 18



...全文
953 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]
拼Table吧
[/Quote]
请问拼Table什么思路?
yp19910928 2012-03-31
  • 打赏
  • 举报
回复
拼Table吧
xie_yanke 2012-03-31
  • 打赏
  • 举报
回复
<%@ Page Language="C#" %>
<script runat="server">
private void Page_Load()
{
List<Test> list = new List<Test>();
list.Add(new Test("a2", "b3", "c3"));
list.Add(new Test("a1", "b1", "c1"));
list.Add(new Test("a1", "b2", "c2"));
list.Add(new Test("a1", "b21", "c21"));
list.Add(new Test("a3", "b4", "c4"));
list.Add(new Test("a3", "b41", "c41"));

gridView.DataSource = list;
gridView.DataBind();
}

private string t1 = string.Empty;
private void gridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
switch (e.Row.RowType)
{
case DataControlRowType.DataRow:
Test test = e.Row.DataItem as Test;
if (t1 != test.a) t1 = string.Empty;

List<Test> list = gridView.DataSource as List<Test>;
int x = list.Where<Test>(delegate(Test obj) { return obj.a == test.a; }).Count();
if (x > 1)
{
if (t1 == string.Empty)
{
e.Row.Cells[0].Attributes.Add("rowspan", x.ToString());
t1 = test.a;
}
else {
e.Row.Cells.RemoveAt(0);
}
}
break;
}
}

private class Test
{
private string _a;
public string a { get { return _a; } set { _a = value; } }
private string _b;
public string b { get { return _b; } set { _b = value; } }
private string _c;
public string c { get { return _c; } set { _c = value; } }

public Test(string A, string B, string C)
{
_a = A;
_b = B;
_c = C;
}
}
</script>
<!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 runat="server">
<asp:GridView ID="gridView" runat="server" OnRowDataBound="gridView_RowDataBound">
</asp:GridView>
</form>
</body>
</html>
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
在合并的过程中,有一些列需做些特殊的处理,如你提到的照片的情况,没上传,是空或null,在代码中判断出来,合并处理。
[/Quote]
比如连续两个人都没上传照片,是不能合并到一起的
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]

8楼不可以?
引用 12 楼 的回复:
每个人包含的“其它列”的数目不一定是一样的

其他列数目不一定,你又不用合并那个其他列.可以不用管

引用 15 楼 的回复:
比如连续两个人都没上传照片,是不能合并到一起的

没上传照片的话你是用录入数据时是用默认图片,还是空字符串录入,还是null
在合并的时候判断下就可以.
[/Quote]
数据库中照片是image类型的,如果不上传照片默认是null
SomethingJack 2012-03-30
  • 打赏
  • 举报
回复
repeater多么好多么方便 哎你说你````
happytonice 2012-03-30
  • 打赏
  • 举报
回复
在合并的过程中,有一些列需做些特殊的处理,如你提到的照片的情况,没上传,是空或null,在代码中判断出来,合并处理。
  • 打赏
  • 举报
回复
每个人包含的“其它列”的数目不一定是一样的
  • 打赏
  • 举报
回复

原始样式
姓名 照片 性别 出生年月 其它列1 其它列2 其它列3
A P M XXXX O1 O2 O3
A P M XXXX O4 O5 O6
A P M XXXX O7 O8 O9
A P M XXXX 10 11 12
---------------------------------------------
B P2 F YYYY 13 14 15
B P2 F YYYY 16 17 18
B P2 F YYYY 19 20 21
---------------------------------------------
C P2 F ZZZZ 22 23 24
C P2 F ZZZZ 25 26 27
C P2 F ZZZZ 28 29 30
C P2 F ZZZZ 31 32 33
C P2 F ZZZZ 34 35 36


需求样式
姓名 照片 性别 出生年月 其它列1 其它列2 其它列3
O1 O2 O3
A P M XXXX O4 O5 O6
O7 O8 O9
10 11 12
----------------------------------------------
13 14 15
B P2 F YYYY 16 17 18
19 20 21
----------------------------------------------
22 23 24
25 26 27
C P2 F ZZZZ 28 29 30
31 32 33
34 35 36
  • 打赏
  • 举报
回复
其他列的行数可能更多,例如

原始样式
姓名 照片 性别 出生年月 其它列1 其它列2 其它列3
A P M XXXX O1 O2 O3
A P M XXXX O4 O5 O6
A P M XXXX O7 O8 O9
A P M XXXX 10 11 12
---------------------------------------------
B P2 F YYYY 13 14 15
B P2 F YYYY 16 17 18
B P2 F YYYY 19 20 21
---------------------------------------------
C P2 F ZZZZ 22 23 24
C P2 F ZZZZ 25 26 27
C P2 F ZZZZ 28 29 30
C P2 F ZZZZ 31 32 33
C P2 F ZZZZ 34 35 36


需求样式
姓名 照片 性别 出生年月 其它列1 其它列2 其它列3
O1 O2 O3
A P M XXXX O4 O5 O6
O7 O8 O9
10 11 12
----------------------------------------------
13 14 15
B P2 F YYYY 16 17 18
19 20 21
----------------------------------------------
22 23 24
25 26 27
C P2 F ZZZZ 28 29 30
31 32 33
34 35 36

因为允许不上传照片,所以可能会出现相邻两人都没照片的情况
huangwenquan123 2012-03-30
  • 打赏
  • 举报
回复
8楼不可以?
[Quote=引用 12 楼 的回复:]
每个人包含的“其它列”的数目不一定是一样的
[/Quote]
其他列数目不一定,你又不用合并那个其他列.可以不用管

[Quote=引用 15 楼 的回复:]
比如连续两个人都没上传照片,是不能合并到一起的
[/Quote]
没上传照片的话你是用录入数据时是用默认图片,还是空字符串录入,还是null
在合并的时候判断下就可以.
beautiful_melody 2012-03-30
  • 打赏
  • 举报
回复
100分就是认识回答的人多啊
huangwenquan123 2012-03-30
  • 打赏
  • 举报
回复

protected void Page_Load(object sender, EventArgs e)
{
//...
GridView1.DataSource = dt;
GridView1.DataBind();
GroupName(0);
GroupName(1);
GroupName(3);
GroupSex();
}
public void GroupName(int col)
{
TableCell oldName = GridView1.Rows[0].Cells[col];
for (int i = 1; i < GridView1.Rows.Count; i++)
{
TableCell Name = GridView1.Rows[i].Cells[col];
if (oldName.Text == Name.Text)
{
Name.Visible = false;
if (oldName.RowSpan == 0)
{
oldName.RowSpan = 1;
}
oldName.RowSpan++;
oldName.VerticalAlign = VerticalAlign.Middle;
}
else
{
oldName = Name;
}
}
}
public void GroupSex()
{
TableCell oldName = GridView1.Rows[0].Cells[0];
TableCell oldSex = GridView1.Rows[0].Cells[2];
for (int i = 1; i < GridView1.Rows.Count; i++)
{
TableCell Name = GridView1.Rows[i].Cells[0];
TableCell Sex = GridView1.Rows[i].Cells[2];
if (oldName.Text == Name.Text && oldSex.Text == Sex.Text)
{
Sex.Visible = false;
if (oldSex.RowSpan == 0)
{
oldSex.RowSpan = 1;
}
oldSex.RowSpan++;
oldSex.VerticalAlign = VerticalAlign.Middle;
}
else
{
oldName = Name;
oldSex = Sex;
}
}
}

  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
这样的页面最好用table来做,然后ajax去后台取数据这样的灵活性大一点。
[/Quote]
请问table如何做?另外效果请看5楼,比如可能性别这列相邻的两个都相同,但是也要分开合并
  • 打赏
  • 举报
回复

原始样式
姓名 照片 性别 出生年月 其它列1 其它列2 其它列3
A P M XXXX O1 O2 O3
A P M XXXX O4 O5 O6
A P M XXXX O7 O8 O9
B P2 F YYYY 10 11 12
B P2 F YYYY 13 14 15
B P2 F YYYY 16 17 18
C P3 F ZZZZ 19 20 21
C P3 F ZZZZ 22 23 24
C P3 F ZZZZ 25 26 27

需求样式
姓名 照片 性别 出生年月 其它列1 其它列2 其它列3
O1 O2 O3
A P M XXXX O4 O5 O6
O7 O8 O9
10 11 12
B P2 F YYYY 13 14 15
16 17 18
19 20 21
C P3 F ZZZZ 22 23 24
25 26 27


请忽略5楼!
  • 打赏
  • 举报
回复

原始样式
姓名 照片 性别 出生年月 其它列1 其它列2 其它列3
A P M XXXX O1 O2 O3
A P M XXXX O4 O5 O6
A P M XXXX O7 O8 O9
B P2 F YYYY 10 11 12
B P2 F YYYY 13 14 15
B P2 F YYYY 16 17 18
需求样式
姓名 照片 性别 出生年月 其它列1 其它列2 其它列3
O1 O2 O3
A P M XXXX O4 O5 O6
O7 O8 O9
10 11 12
B P2 F YYYY 13 14 15
16 17 18
19 20 21
C P3 F ZZZZ 22 23 24
25 26 27
k8236721 2012-03-30
  • 打赏
  • 举报
回复
一般都用Table 好操作
zhangdaowu5 2012-03-30
  • 打赏
  • 举报
回复
这样的页面最好用table来做,然后ajax去后台取数据这样的灵活性大一点。
liang_24 2012-03-30
  • 打赏
  • 举报
回复

/// <summary>
/// 合并行(合并的列要用Label控件)
/// </summary>
/// <param name="gvw">需要合并的GridView</param>
/// <param name="sCol">要合并的列(从0开始)</param>
/// <param name="controlName">控件名称</param>
public static void MergeRows(GridView gvw, int col, string controlName)
{
for (int rowIndex = gvw.Rows.Count - 2; rowIndex >= 0; rowIndex--)
{
GridViewRow row = gvw.Rows[rowIndex];

GridViewRow previousRow = gvw.Rows[rowIndex + 1];

Label row_lbl = row.Cells[col].FindControl(controlName) as Label;
Label previousRow_lbl = previousRow.Cells[col].FindControl(controlName) as Label;

if (row_lbl != null && previousRow_lbl != null)
{
if (row_lbl.Text == previousRow_lbl.Text)
{
row.Cells[col].RowSpan = previousRow.Cells[col].RowSpan < 1 ? 2 : previousRow.Cells[col].RowSpan + 1;

previousRow.Cells[col].Visible = false;
}
}
}
}


<asp:GridView ID="gvUVSourceDistributionStatistic" runat="server" AutoGenerateColumns="false" CssClass="tableBorder"
onmouseover="changeto()" onmouseout="changeback()" Width="98%" HorizontalAlign="Center">
<Columns>
<asp:TemplateField HeaderText="日期" ItemStyle-HorizontalAlign="Center" HeaderStyle-Height="30"
ItemStyle-Height="25">
<ItemTemplate>
<asp:Label ID="lblSearchDate" runat="server" Text='<%# Convert.ToDateTime(Eval("SearchDate")).ToString("yyyy-MM-dd") %>' />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField HeaderText="访客来源" DataField="VisitorSource" ItemStyle-HorizontalAlign="Center"/>
</Columns>
</asp:GridView>

调用MergeRows方法要在绑定GridView后调用,这样就能解决了。
不过我也有个疑问:为什么不用控件包着要合并的列的话,遍历GridView的每一行时会显示要合并的列的单元格的值是空,如果不为空就不需要用控件来包着了,知道为什么的,告诉一声,谢谢
  • 打赏
  • 举报
回复
各位大侠,讨论结果是怎样的,哪种方法实现比较简单呢?
标题:“wpf GridView 合并单元格 Demo” 描述:“wpf GridView 合并单元格 Demo 简单 适合新手 使用工具vs2017” 标签:“wpf gridview 合并单元格” 压缩包子文件的文件名称列表: wpfGridView合并单元格Demo 知识点: 1. WPF简介:WPF(Windows Presentation Foundation)是微软公司推出的一种用于构建Windows客户端应用程序的用户界面框架。它提供了丰富的界面元素和控件,使得开发者可以创建出美观、交互性强的应用程序。 2. GridView控件:在WPF中,GridView是用于显示网格数据的一种控件,通常用在DataGrid或者ListBox中,提供了一种数据的显示方式,可以很好的显示复杂的数据结构。GridView可以自定义列头、排序、过滤等。 3. 合并单元格:在GridView控件中,有时需要将多个单元格合并为一个单元格,以显示更加复杂或者更加美观的数据布局。在WPF中,这可以通过定义ColumnSpan属性来实现。ColumnSpan属性指明了一个单元格应该横跨多少列,从而实现单元格的合并。 4. Visual Studio 2017:Visual Studio 2017是微软推出的一款集成开发环境(IDE),它支持多种编程语言,包括C#、VB.NET、F#等,是开发WPF应用程序的主要开发工具。Visual Studio 2017为开发者提供了代码编辑、调试、性能分析等多种功能。 5. 新手使用WPF:对于新手来说,WPF是一个很好的学习平台,因为它提供了丰富的教程和文档。学习WPF可以加深对面向对象编程和事件驱动编程的理解,从而提高编程技能。 详细分析: 本Demo主要演示如何在WPF的GridView控件中实现单元格的合并。通过学习本Demo,初学者可以了解到如何使用Visual Studio 2017创建WPF应用程序,如何在其中使用GridView控件,以及如何设置GridView中的单元格合并。 在本Demo中,首先需要创建一个新的WPF应用程序项目,在Visual Studio 2017中,选择创建WPF应用程序的项目类型,然后为项目添加新的窗体(Window)。 在窗体的XAML代码中,我们可以添加一个DataGrid控件,然后在DataGrid控件中设置GridView作为其列的显示方式。在GridView中,定义多列(Column),并通过ColumnSpan属性来设置需要合并的单元格。例如,若要合并第二列和第三列的单元格,可以设置这两个列的ColumnSpan属性为2。 在C#代码中,我们可以对DataGrid控件进行数据绑定的操作,将数据源绑定到DataGrid控件中,从而使得GridView可以显示数据。在这个过程中,数据绑定是一个重要的概念,它使得控件可以显示并操作数据,是WPF中非常核心的一个功能。 在本Demo中,还应注意的一点是如何设置DataGrid的样式和模板,使得GridView可以更加美观。在WPF中,可以通过修改XAML代码中的样式(Style)来实现,样式包括了字体、颜色、边框、背景等属性的设置。 对于初学者来说,本Demo可以作为学习WPF的入门示例。通过学习本Demo,初学者可以了解到WPF的基本结构,包括XAML和C#代码的编写,控件的使用,数据绑定,样式设置等。同时,本Demo还介绍了一些WPF的高级概念,如ColumnSpan属性的使用,这可以帮助初学者更好的理解WPF,提高其编程技能。在实际的学习过程中,初学者可以尝试修改Demo的代码,通过实践来加深对WPF的理解。

62,256

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧