我正在处理ASP.NET Web Forms
申请。业务逻辑是 - 我有很多用户,每个用户我有几个帐户。我有一个视图,系统的用户可以添加人,并在添加我想要显示的人(我选择表格)时,该人的姓名和与他相关的所有帐户。所以最终输出应该是这样的:
<span>Person name</span>
<table>
<tr>Account 1 info..</tr>
<tr>Account 2 info..</tr>
..
</table>
<span>Another Person name</span>
<table>
<tr>Account 1 info..</tr>
<tr>Account 2 info..</tr>
..
</table>
所以我决定这可能是两个嵌套转发器的相对标准。所以我在我的观点中添加了两个:
<asp:Repeater id="RpAccountsToDistraint"
OnItemDataBound="RpAccountsToDistraint_ItemDataBound"
runat="server">
<ItemTemplate>
<fieldset><legend>Person name</legend>
<asp:Repeater ID="RpInnerAccountsToDistraint"
OnItemDataBound="RpInnerAccountsToDistraint_ItemDataBound"
runat="server">
<HeaderTemplate>
<table>
<thead>
<tr>
<th>Account</th>
</tr>
</thead>
</HeaderTemplate>
<ItemTemplate>
<tbody>
<tr>
<td>Account Amount..</td>
..
</tbody>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
我不会写整个标记,因为我认为它是标准的,而且我认为我的问题出在服务器端。问题是,每次我将一个人添加到列表中时,新的fieldset
都会从第一个转发器中正确添加,但是现在逻辑在我的代码中被硬编码,所以它不是我的东西可以涉及到。但是每次添加新人时都会从数据库中获取实际信息,这就是问题所在 - 当我添加第一个人时 - 我会使用正确的帐户信息获得一个fieldset
。当我添加第二个等等时,新的字段集会正确添加到页面中,但每个字段集都包含最后一个选定用户的帐户信息。
所以从我看到的问题是,我无法以适当的方式为内置中继器供电。最近我不得不使用Repeater工作,所以我习惯于在ViewState
中保留旧数据,添加新数据,保留旧数据等等。我有一个名为ClientAccount
的对象,我用它作为转发器。我尝试了很多数据结构来存储数据,以便正确显示 - List<ClientAccount
,List<List<ClientAccount>>
,Dictionary<int, List<ClientAccount>>
,而调试我可以在某些时候看到所有信息 - 旧的收集新的,但只显示最后一个用户的信息。关于如何改进我的代码的Ay建议,或者涵盖与此类似的主题的示例将受到高度赞赏。以下是我在代码中使用的内容:
protected void ParentRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.AlternatingItem
|| e.Item.ItemType == ListItemType.Item)
{
Repeater innerRepeater =
(Repeater)e.Item.FindControl("RpInnerAccountsToDistraint");
if (null == feedAccountRptr)
{
feedAccountRptr = new Dictionary<int, List<ClientAccount>>();
}
if (!(((Dictionary<int, List<ClientAccount>>)ViewState["theAccounts"]) == null))
{
feedAccountRptr = ((Dictionary<int, List<ClientAccount>>)ViewState["theAccounts"]);
}
int count = feedAccountRptr.Count;
feedAccountRptr.Add(++count, GetAccountsForClient());
ViewState["theAccounts"] = feedAccountRptr;
innerRepeater.DataSource = GetAccountsForClient();// feedAccountRptr;
innerRepeater.DataBind();
}
和
protected void InnerRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.AlternatingItem
|| e.Item.ItemType == ListItemType.Item)
{
//Just take the values from my controls but actually not doing anything else
las事件,变量feedAccountRptr
是一个类成员,在类Dictionary<int, List<ClientAccount>> feedAccountRptr;
的基础上进行了分析。