GridView完成不了的样子

oN5GrzoN 2011-08-19 12:11:38
比如,有两个表,班级表、学生表
班级表
班级ID 班级名
1 一班

学生表
学生ID 学生名 所在班级
111 aaa 1


在GridView里显示查询学生的结果,是这样显示的

班级 学生
1 2222
1 111
2 aaa

但客户想显示成
班级1
有学生:2222 1111
班级2
有学生:aaa....
...全文
92 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
子夜__ 2011-08-19
  • 打赏
  • 举报
回复
两张表关联查询。
带一个count 属性

inner join
然后显示出来就行了。
暖枫无敌 2011-08-19
  • 打赏
  • 举报
回复
GridView嵌套模板列就可以实现,外层GridView绑定班级表的班级名称,里层根据外层的每一个班级的ID来获取所有的学生,就可以搞定了。
LMAOhuaNL 2011-08-19
  • 打赏
  • 举报
回复
楼上可以实现,顶
jolin_sy 2011-08-19
  • 打赏
  • 举报
回复

DataTable dt1 = new DataTable();

dt1.Columns.Add("班级", typeof(string));
dt1.Columns.Add("有学生", typeof(int));
dt1.PrimaryKey = new DataColumn[] { dt1.Columns[0], dt1.Columns[1], dt1.Columns[2] };
dt1.Rows.Add("班级1", 1,);
DataTable dt2 = new DataTable();
dt2.Columns.Add("班级", typeof(string));
dt2.Columns.Add("有学生", typeof(string));
dt2.PrimaryKey = new DataColumn[] { dt2.Columns[0], dt2.Columns[1], dt2.Columns[2] };
dt2.Rows.Add("班级2", 2, );

DataTable dt3 = dt1.Copy();
dt3.Merge(dt2);


YnSky 2011-08-19
  • 打赏
  • 举报
回复
最简单的用sql做出效果.gridview直接显示.
很简单的!
deng_yuxi 2011-08-19
  • 打赏
  • 举报
回复
xuexile
lhnlyy520 2011-08-19
  • 打赏
  • 举报
回复
<asp:DataList ID="DL" runat="server" Width="100%">
<ItemTemplate>
<table border="0" cellpadding="2" cellspacing="0" width="100%">
<tr>
<td class="lblReportTitleH2" align="left" style="width: 70%">
<asp:Label ID="lblReturnable" runat="server" Text=' <%#Eval("ClassName")%>'></asp:Label>
</td>
</tr>
<tr>
<td>
<asp:Label ID="lblReturnable" runat="server" Text=' <%#Eval("Students")%>'></asp:Label>
</td>
</tr>
</table>
</ItemTemplate>
</asp:DataList>
把一个DataList当作一条Gridview的记录来显示
  • 打赏
  • 举报
回复
DataList,不要用GridView。
暖枫无敌 2011-08-19
  • 打赏
  • 举报
回复







程序代码如下:

<!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:Repeater ID="rpt" runat="server" onitemdatabound="rpt_ItemDataBound">
<HeaderTemplate>
<table border="1">
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<asp:Label ID="lbGrade" runat="server" Text='<%#Eval("班级名") %>'></asp:Label>
</td>
</tr>
<tr>
<td>
<asp:Repeater ID="rpt2" runat="server">
<HeaderTemplate>
<table border="1">
<tr>
</HeaderTemplate>
<ItemTemplate>
<td>
<asp:Label ID="lbStuName" runat="server" Text='<%#Eval("学生名") %>'></asp:Label>
</td>
</ItemTemplate>
<FooterTemplate>
</tr> </table>
</FooterTemplate>
</asp:Repeater>
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
</div>
</form>
</body>
</html>


public partial class WebForm1 : System.Web.UI.Page
{
private int i = 0;

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindFirstRepeater();//绑定外层Repeater,显示班级
}
}

/// <summary>
/// 绑定外层Repeater,显示班级
/// </summary>
public void BindFirstRepeater()
{
DataSet ds = new DataSet();
using (SqlConnection con = new SqlConnection("Data Source=localhost;uid=sa;pwd=saiyang;Database=CSDN"))
{
con.Open();
string strSQL = "select * from 班级表 ";
using (SqlDataAdapter adapter = new SqlDataAdapter(strSQL, con))
{
adapter.Fill(ds);
}
}
this.rpt.DataSource = ds;
this.rpt.DataBind();
}

/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void rpt_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
DataRowView drv = (DataRowView)e.Item.DataItem;
Repeater repeater = (Repeater)e.Item.FindControl("rpt2");

DataSet ds = new DataSet();
using (SqlConnection con = new SqlConnection("Data Source=localhost;uid=sa;pwd=saiyang;Database=CSDN"))
{
con.Open();
string strSQL = "select * from 学生表 where 所在班级="+int.Parse(drv["班级ID"].ToString());
using (SqlDataAdapter adapter = new SqlDataAdapter(strSQL, con))
{
adapter.Fill(ds);
}
}
repeater.DataSource = ds;
repeater.DataBind();
//触发内层Repeater的ItemDataBound事件
repeater.ItemDataBound += new RepeaterItemEventHandler(repeater_ItemDataBound);
}
}

void repeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
//每行显示8个学生,可以根据需要进行调整
if (i % 8 == 0 && i > 0)
{
e.Item.Controls.Add(new LiteralControl("</tr><tr>"));
}
i++;
}
}
如果您要处理用大量的比如说:一百个数据项(例如,收件箱里的邮件列表)的列表(译注:本文将items译为数据项),过滤、查找、分类,以及其它分组功能将很快变得困难而单调乏味。特别是排序和分组大大提高了一个列表中数据项的结构,默认情况下,这是我想要应用到我的所有列表的功能特性。特别情况下,我还会寻找一个允许将相似的项一起安排和分组列表/网格的控件,很像在Outlook 2003中使用的网格(或列表?)。 我知道这里有一些支持这类功能的商业列表/网格(控件);然而,在试用它们的时候我也遇到过若干bug。不能访问源代码(译注:因为商业目的)使得这非常令人沮丧,因此我想倒不如我写篇CodeProject文章,看看我是否可以拿出一个自定义解决方案。 因为网格比列表更加灵活,我决定实现一个可以一起分组的网格控件,正如Outlook一样。这个控件用C#2.0在VS 2005上实现的。现在,我不能保证这个实现没有bug,但至少它是免费的,并且它有源代码。因而,您可以根据您的需要修改它们,以适合于您自己的用途。无论如何要注意:这个控件并没有完成!一些功能也许不能正确地工作或完全不能工作。该控件主要关注于排序、分组并在网格上显示数据项,这些功能特性我想已做得相当地好了。在网格中插入、更新和删除行及单元格不在我考虑的范围之内。 在这篇文章中,我将解释这个控件怎么用,和它能做什么,并且也包含了什么它不能做,主要把焦点集中在只想要按现在的样子复用该控件的开发组。然后,对于为了他们自己的用途想要扩展或改变这个控件的实现的开发者,我将对这个控件内部运作做一点更为详细的解释。

62,074

社区成员

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

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

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

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