【问题标题】:repeater control using multiple Array List使用多个数组列表的中继器控制
【发布时间】:2009-12-19 00:04:58
【问题描述】:

我正在使用嵌套中继器 中继器1> 标签1> 中继器2> label2> 来自 arraylist(ar1) 的数据 Textbox> 数据来自两个不同的arraylist??(ar2 and ar3)

早些时候,我用它连接了一个阵列。它工作正常。但问题是现在我有 3 个不同的 arraylist 用于 2 个不同的控件。

三个arraylist ar1,ar2,ar3

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

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

如果我只使用一个数组列表,我使用的是 ,但如果我使用它 3 次它就不起作用。

在repeater2中我正在做 标签文本= 但我不知道如何将中继器 2 中的数据绑定到 ar1,ar2,ar3。

谢谢,

PS

【问题讨论】:

    标签: asp.net repeater


    【解决方案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>
    

    代码隐藏(初始化数组和数据绑定):

            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 事件。

    【讨论】:

    • 我有点困惑,根据你所说的所以让我们说如果我的 ascx 文件有 thi Repeater1 repeater2 name=> /repeater2> Repeater1 和 ascx.cs 如果我将 repeater2 分配给组合。我怎么能知道哪些arraylist值去那里。我所有的arraylist都是相同的但是你能详细告诉我你想在这里做什么
    • 您能否在您的原始帖子中提供更多代码?或许还有您尝试绑定的数据示例?另外,你为什么要手动设置文本框的 ID?您将遇到的一个问题是页面上每个控件的 ID 必须是唯一的。因此,如果您在 ArrayList #2 中有 5 个条目,并且您将其绑定到控件的 ID,那么您将只能使用这些值一次,然后您必须为下一个类别生成新的 ID。
    • 感谢 Jim 对此的详细解释。您的回答对我来说看起来很有希望,但我只有一个疑问。在 ascx 文件中,您如何分配我的意思的值。您已经在标签和文本中编写了 和 但我认为只有在从数据源进行评估时才能做到这一点( key 和 Value 即将到来来自数据源)。在你的 ascx.cs 文件中你也没有提到它们所以我得到了这个组合包含所有三个数组列表但是如何在 ascx 中表示它。
    • 正如我上面提到的,到目前为止我一直在使用 。但是如果我在 ascx 中使用它,它不会告诉哪个数组列表用于文本框哪个用于标签。 Yah 和 ID 是独一无二的
    • Key 指的是 Dictionary.Key,Value 指的是 Dictionary.Value。对于被绑定的对象,Key 是字符串,Value 是内部字典。因此,在嵌套中继器中,Key 指的是 inner.Key,value 指的是 inner.Value。此外,如果您的 IDS 确实是唯一的,则从中提取 ID 的 ArrayList 必须大于其他集合(否则 Category1 id 将与 Category2 相同,因此是无效的 html)
    【解决方案2】:

    吉姆解决了一个问题:已编辑

    asp:Repater Id="Repeater1" runat="Server">
    项目模板>

     <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

    字典> 组合 = 新字典>();

                    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();
    

    现在如何判断输入中的key与inner有关,而label中的key与combined有关?

    【讨论】:

    • DataBinder.Eval(((RepeaterItem)Container.Parent.Parent).DataItem,"Key") 将访问父中继器的密钥。它的工作方式是 Container.Parent 是当前的中继器。该父级是父级中继器中的行。因此,您转换该行并获取 DataItem,然后评估“Key”。我希望这会有所帮助。
    • 另外,您可能想看看使用其他一些数据结构。在您的情况下,由于您要从子项访问父项,因此您可能希望创建一个具有通用类别列表的类,并且对于每个类别,都有一个子类别和引用父类别的文本项。这样,在需要时持久化数据会容易得多。使用 XML 进行处理并将 XML 转换为所需的控制结构甚至可能更容易。
    • 我猜你在父中继器中弄错了我不想要字典键值对中的值。父中继器中的值来自与此无关的其他数组列表。 Main 是使用不同 arraylist 的子类别,正如我在 ascx.cs 文件中显示的那样,它仅连接到 repeater2,所以我不能使用第一种方法。我会尝试通过第二种方法来做到这一点可能是有效的
    • Jim 感谢您的帮助,以前没想过。我使用了 Datatable 并添加了三列并将它们的值放入其中。它工作得非常好。
    猜你喜欢
    • 2012-03-10
    • 2013-08-06
    • 1970-01-01
    • 2013-02-20
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    相关资源
    最近更新 更多