使用多个阵列列表控制中继器

时间:2009-12-19 00:04:58

标签: asp.net repeater

我正在使用嵌套转发器 repeater1> label1的> repeater2> LABEL2>数据来自arraylist(ar1)<%container.Dataitem> 文本框>数据来自两个不同的arraylist ??(ar2和ar3)

Earilier我用它连接了一个arraylsit。它工作正常。但问题是现在我有2个不同的控制器有3个不同的arraylist。

三个arraylist ar1,ar2,ar3

在文本框中我希望id来自ar1名称来自ar2

并且在标签中我想要来自ar3的文本。

我使用<%#container.Dataitem%>如果我只使用一个数组列表,但如果我使用它三次则无法正常工作。

在repeater2中我正在做 label text =<%#container.Dataitem%> 但我不知道如何将转发器2中的数据绑定到ar1,ar2,ar3。

谢谢,

PS

2 个答案:

答案 0 :(得分:1)

我处理这个的方法是将ArrayLists处理成其他一些集合并绑定到它。

例如,如果您的集合都具有相同数量的项目:

Dictionary<string, KeyValuePair<string, string>> combined = 
           new Dictionary<string, KeyValuePair<string, string>>();
for(int i = 0; i < list1.Count; i ++)
{
    combined.Add(list1[i], new KeyValuePair(list2[i], list3[i]));
}

然后,在itemdatabound事件中处理嵌套转发器的绑定。这似乎是不必要的处理,但它会使逻辑更容易。

(要绑定TextBox,您必须手动查找行中的控件并在ItemDataBound事件中设置ID和Text)

编辑:这是我假设您正在尝试做的一个工作示例:

ASPX代码:

<asp:Repeater ID="categoryRepeater" runat="server">
    <HeaderTemplate><dl></HeaderTemplate>
    <ItemTemplate>
    <dt><em><%# Eval("Key") %></em></dt>
    <dd>
        <asp:Repeater ID="nestedRepeater" runat="server" DataSource='<%# Eval("Value") %>' >
            <HeaderTemplate><ol></HeaderTemplate>
            <ItemTemplate>
                <li>
                    <asp:Label ID="lblSubCategory" 
                        runat="server" 
                        Text='<%# Eval("Key") %>' />
                    <asp:TextBox ID="txtInformation"
                        runat="server"
                        Text='<%# Eval("Value") %>' />
                </li>
            </ItemTemplate>
            <FooterTemplate></ol></FooterTemplate>
        </asp:Repeater>
    </dd>
    </ItemTemplate>
    <FooterTemplate></dl></FooterTemplate>
    </asp:Repeater>

Codebehind(Init Arrays和DataBind):

        ArrayList categories = new ArrayList 
            { "Category", "Category 2", 
                "Category 3", "Category 4" };
        ArrayList subCategories = new ArrayList 
            { "SubCategory 1", "SubCategory 2", 
                "SubCategory 3", "SubCategory 4" };
        ArrayList textControlNames = new ArrayList 
            { "Enter 1", "Enter 2", "Enter 3", "Enter 4" };

        Dictionary<string, Dictionary<string, string>> combined =
                new Dictionary<string, Dictionary<string, string>>();
        for (int i = 0; i < categories.Count; i++)
        {
            Dictionary<string, string> inner = new Dictionary<string, string>();
            for (int j = 0; j < subCategories.Count;j++)
            {
                inner.Add(subCategories[j].ToString(),
                    textControlNames[j].ToString());
            }
            combined.Add(categories[i].ToString(), inner);
        }

        categoryRepeater.DataSource = combined;
        categoryRepeater.DataBind();

请注意,由于您无法为标签或文本框生成相同的ID,因此我没有像我最初提到的那样包含ItemDataBound事件。

答案 1 :(得分:0)

Jim工作正常,有一个问题:编辑

asp:Repater Id =“Repeater1”runat =“Server”&gt;
的ItemTemplate&GT;&LT;%#的Container.DataItem%GT;

 <asp:Repeater ID="Repeater2" runat="server">

                <ItemTemplate>
                <tr>  <td> <input id='<%# Eval("Key") %>' type="text" name='<%# Eval("Value") %>' /></td></tr>       

                      <th class="brochuretitle"><asp:Label runat="server" ID="Label2" Text='<%#Eval("Key")%>'></asp:Label></th>   

                </ItemTemplate>


        </asp:Repeater>

和ascx.cs

词典&GT; combined = new Dictionary&gt;();

                Dictionary<string, string> inner = new Dictionary<string, string>(); 

              for (int j = 0; j < ar3.Count; j++) 

              { 
                  inner.Add(ar3[j].ToString(),ar4[j].ToString());
                //  inner.Add(subCategories[j].ToString(), textControlNames[j].ToString()); 
              }
              for (int k = 0; k < ar1.Count; k++)
              {

                  combined.Add(ar1[k].ToString(), inner);
              }


                ((Repeater)(rptrItem.FindControl("Repeater2"))).DataSource = combined;
                ((Repeater)(rptrItem.FindControl("Repeater2"))).DataBind();

现在如何判断输入中的键与标签中的内键和键有关?是否与组合相关?