如何使用嵌套转发器动态添加/删除数据

时间:2014-08-21 13:32:21

标签: c# asp.net

我正在处理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<ClientAccountList<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;的基础上进行了分析。

0 个答案:

没有答案