Repeater 嵌套的问题

zhou_she 2008-02-29 10:09:17
有一个商品订单的IList泛型类,我现在要把商品订单全部呈现出来,
IList<Order> orderList=new List<Order>();//声明
orderList=GetOrderList();//获取订单列表
repeater.DataSource=orderList;//绑定到repeater控件

但是orderList类下还有一个成员,orderList.ProductList,这个成员变量是IList类型,是指订单里的产品列表,也就是说一个产品订单里有多个商品.
现在我要把它们用嵌套Repeater显示出来,大家给个方法


示意图如下:

订单一

用户名:XX
运送地址:XX
产品列表:
产品1
产品2
……

订单二

用户名:XX
运送地址:XX
产品列表:
产品1
产品2
……

...全文
241 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
bingdian37 2008-02-29
  • 打赏
  • 举报
回复
怎么把这一句也去掉呢??

protected void Page_Load(object sender, EventArgs e)
{
Repeater1.DataBind();
}
bingdian37 2008-02-29
  • 打赏
  • 举报
回复
学习了,谢谢,谢谢
bingdian37 2008-02-29
  • 打赏
  • 举报
回复

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Trace="false" %>

<!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="Repeater1" runat="server" DataSource=<%# getOrderList() %>>
<ItemTemplate>
<p>用户名:<%# Eval("UserName") %></p>
<p>地址:<%#Eval("Address") %></p>
<p>产品列表</p>
<asp:Repeater ID="Repeater2" runat="server" DataSource=<%# ((Order)Container.DataItem).ProductList %> >
<ItemTemplate>
<p>   产品<%# Container.DataItem %></p>
</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:Repeater>
</div>
</form>
</body>
</html>



using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Repeater1.DataBind();
}

public System.Collections.Generic.IList<Order> getOrderList()
{
System.Collections.Generic.IList<Order> orderList = new System.Collections.Generic.List<Order>();
Order ord;

ord = new Order();
ord.UserName = "UserA";
ord.Address = "UserA.Address";
orderList.Add(ord);

ord = new Order();
ord.UserName = "UserB";
ord.Address = "UserB.Address";
orderList.Add(ord);

return orderList;
}
}

public class Order
{
private string userName;

public string UserName
{
get { return userName; }
set { userName = value; }
}
private string address;

public string Address
{
get { return address; }
set { address = value; }
}
private System.Collections.Generic.IList <string> productList;

public System.Collections.Generic.IList <string> ProductList
{
get {
productList = new System.Collections.Generic.List <string> ();
string str;
str = UserName + "1";
productList.Add(str);
str = UserName + "2";
productList.Add(str);
str = UserName + "3";
productList.Add(str);


return productList;
}
set { productList = value; }
}

}
bingdian37 2008-02-29
  • 打赏
  • 举报
回复
谢谢楼上的.^_^

改了一下,把事件给去掉了

阿非 2008-02-29
  • 打赏
  • 举报
回复
@bingdian37
<asp:Repeater ID="Repeater2" runat="server" OnItemDataBound="Repeater2_ItemDataBound">
可以在上面直接指定DataSource 的
insus 2008-02-29
  • 打赏
  • 举报
回复
bingdian37 2008-02-29
  • 打赏
  • 举报
回复
效果如下




用户名:UserA

地址:UserA.Address

产品列表

产品UserA1

产品UserA2

产品UserA3

用户名:UserB

地址:UserB.Address

产品列表

产品UserB1

产品UserB2

产品UserB3



希望能解决楼主的问题

bingdian37 2008-02-29
  • 打赏
  • 举报
回复
HTML代码中,,去掉OnItemCreated="Repeater1_ItemCreated"

呵呵,自己乱加的
bingdian37 2008-02-29
  • 打赏
  • 举报
回复
关键就是这一段

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
Trace.Warn("Repeater1_ItemDataBound");
System.Web.UI.WebControls.Repeater repeater2 = (System.Web.UI.WebControls.Repeater)e.Item.FindControl("Repeater2");
repeater2.DataSource = ((Order)e.Item.DataItem).ProductList;
repeater2.DataBind();

}


e.Item.FindControl这一句,找到Repeater2,因为Repeater2的实际ID是变化的,所以需要这样找到他,嘻嘻
然后进行数据 绑定
((Order)e.Item.DataItem).ProductList;这一句找到当前条目所对应的数据

            <asp:Repeater ID="Repeater2" runat="server" OnItemDataBound="Repeater2_ItemDataBound">
<ItemTemplate>
<p>   产品<%# Container.DataItem %></p>
</ItemTemplate>
</asp:Repeater>

<%# Container.DataItem %>
这个语句,楼主自己斟酌斟酌..呵呵
bingdian37 2008-02-29
  • 打赏
  • 举报
回复
按照楼主的大体意思,写了个页面;



<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Trace="false" %>

<!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="Repeater1" runat="server" OnItemCreated="Repeater1_ItemCreated" OnItemDataBound="Repeater1_ItemDataBound">
<ItemTemplate>
<p>用户名:<%# Eval("UserName") %></p>
<p>地址:<%#Eval("Address") %></p>
<p>产品列表</p>
<asp:Repeater ID="Repeater2" runat="server" OnItemDataBound="Repeater2_ItemDataBound">
<ItemTemplate>
<p>   产品<%# Container.DataItem %></p>
</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:Repeater>
</div>
</form>
</body>
</html>






using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Repeater1.DataSource = getOrderList();
Repeater1.DataBind();

}

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
Trace.Warn("Repeater1_ItemDataBound");
System.Web.UI.WebControls.Repeater repeater2 = (System.Web.UI.WebControls.Repeater)e.Item.FindControl("Repeater2");
repeater2.DataSource = ((Order)e.Item.DataItem).ProductList;
repeater2.DataBind();

}

protected void Repeater2_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
Trace.Warn("Repeater1_ItemDataBound");
}

public System.Collections.Generic.IList<Order> getOrderList()
{
System.Collections.Generic.IList<Order> orderList = new System.Collections.Generic.List<Order>();
Order ord;

ord = new Order();
ord.UserName = "UserA";
ord.Address = "UserA.Address";
orderList.Add(ord);

ord = new Order();
ord.UserName = "UserB";
ord.Address = "UserB.Address";
orderList.Add(ord);

return orderList;
}
}

public class Order
{
private string userName;

public string UserName
{
get { return userName; }
set { userName = value; }
}
private string address;

public string Address
{
get { return address; }
set { address = value; }
}
private System.Collections.Generic.IList <string> productList;

public System.Collections.Generic.IList <string> ProductList
{
get {
productList = new System.Collections.Generic.List <string> ();
string str;
str = UserName + "1";
productList.Add(str);
str = UserName + "2";
productList.Add(str);
str = UserName + "3";
productList.Add(str);


return productList;
}
set { productList = value; }
}

}


cefriend 2008-02-29
  • 打赏
  • 举报
回复
给你一个实例吧 照着做即可,我这里的Repeater1 中嵌套了RadioButtonList

注意用到了 DataSource='<%# ((System.Data.DataRowView)Container.DataItem).CreateChildView("myrelation") %>'

做嵌套记录集,

后台注意
ds.Relations.Add("myrelation",
ds.Tables["questions"].Columns["id"],
ds.Tables["answers"].Columns["questionsid"]);

//Bind the Authors table to the parent Repeater control, and call DataBind.
Repeater1.DataSource = ds.Tables["questions"];
Page.DataBind();


建立父子关系




<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
<HeaderTemplate>
</HeaderTemplate>
<ItemTemplate>
<a>
<%#Container.ItemIndex + 1%>
.</a><asp:Label ID="Label1" runat="server" Text='<%# Eval("subject") %>'></asp:Label>
<a>
<asp:RadioButtonList runat="server" ID="rblsss" RepeatLayout="Table" RepeatDirection="Horizontal"
DataSource='<%# ((System.Data.DataRowView)Container.DataItem).CreateChildView("myrelation") %>'>

</asp:RadioButtonList>
</a>
</ItemTemplate>
<AlternatingItemTemplate>
<a>
<%#Container.ItemIndex + 1%>
.</a><asp:Label ID="Label1" runat="server" Text='<%# Eval("subject") %>'></asp:Label>
<asp:RadioButtonList runat="server" ID="rblsss" RepeatLayout="Table" RepeatDirection="Horizontal"
DataSource='<%# ((System.Data.DataRowView)Container.DataItem).CreateChildView("myrelation") %>'>

</asp:RadioButtonList>
</a>
</AlternatingItemTemplate>
<SeparatorTemplate>
<br />
</SeparatorTemplate>
<FooterTemplate>
</FooterTemplate>
</asp:Repeater>





using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using liuyan;
using System.Data.OleDb;
public partial class exam_demo_testpaper : System.Web.UI.Page
{
#region 属性字段

public string strWhere = "";
#endregion

protected void Page_Load(object sender, EventArgs e)
{

if (!IsPostBack)
{
Bind_rptFiles();
}
}

private void Bind_rptFiles()
{
//Create the connection and DataAdapter for the Authors table.
string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|db.mdb;Persist Security Info=True";
OleDbConnection cnn = new OleDbConnection(connectionString);
OleDbDataAdapter cmd1 = new OleDbDataAdapter("select * from questions", cnn);

//Create and fill the DataSet.
DataSet ds = new DataSet();
cmd1.Fill(ds, "questions");

//Create a second DataAdapter for the Titles table.
OleDbDataAdapter cmd2 = new OleDbDataAdapter("select * from answers", cnn);
cmd2.Fill(ds, "answers");

//Create the relation bewtween the Authors and Titles tables.
ds.Relations.Add("myrelation",
ds.Tables["questions"].Columns["id"],
ds.Tables["answers"].Columns["questionsid"]);

//Bind the Authors table to the parent Repeater control, and call DataBind.
Repeater1.DataSource = ds.Tables["questions"];
Page.DataBind();
//Close the connection.
cnn.Close();
}
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if(e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternatingItem)
{
RadioButtonList rda = e.Item.FindControl("rblsss") as RadioButtonList;
rda.DataTextField = "result";
rda.DataValueField = "id";
rda.DataBind();
}
}
protected void Button1_Click(object sender, EventArgs e)
{
string str = "";
for(int i=0; i< this.Repeater1.Items.Count; i++)
{
RadioButtonList rda = this.Repeater1.Items[i].FindControl("rblsss") as RadioButtonList;

str = str + "|"+ rda.SelectedValue.ToString();
}
this.Label1.Text = str;
}
}

zhou_she 2008-02-29
  • 打赏
  • 举报
回复
产品 <%# Eval("X") %> ////楼主是不是在这里不知道绑定谁?怎么绑定了? 因为数据源不定?



这个数据源就是orderList.ProductList,但是不知具体如何写了
bingdian37 2008-02-29
  • 打赏
  • 举报
回复
嵌套就嵌套啦

<repeater>
<itemtemplate>
用户名:<%# Eval("X") %>
运送地址:<%# Eval("X") %>
产品列表:<%# Eval("X") %>
<repeater>
<itemtemplate>
产品<%# Eval("X") %>////楼主是不是在这里不知道绑定谁?怎么绑定了? 因为数据源不定?
</itemtemplate>
</repeater>
</itemtemplate>
</repeater>
zhou_she 2008-02-29
  • 打赏
  • 举报
回复
所有的订单是一个Repeater,每个订单的产品列表是个Repeater

订单一

用户名:XX
运送地址:XX
产品列表:
产品1
产品2
……

订单二

用户名:XX
运送地址:XX
产品列表:
产品1
产品2
……
milo4210 2008-02-29
  • 打赏
  • 举报
回复
那请LZ 描述下这两个列表应该是怎么个排列方式?
zhou_she 2008-02-29
  • 打赏
  • 举报
回复
楼下的朋友说的也是个好的解决方法,不过我还是想听听别的朋友有没有像我说的那样的解决方案,大家可以相互学习
milo4210 2008-02-29
  • 打赏
  • 举报
回复
不一定用欠套吧,你可以在鼠标移动到某个订单时,弹出一个悬浮的DIV 来显示商品列表嘛

62,074

社区成员

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

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

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

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