【问题标题】:Setting complex members of a control inside a Repeater在 Repeater 中设置控件的复杂成员
【发布时间】:2011-10-05 20:20:25
【问题描述】:

TL;DR

Repeater 中的控件需要特殊实例化才能有用。当每个控件由中继器构造时,如何为它们执行这种特殊的实例化?

设置

我有三个班级:

复杂数据

包含许多不同类型的公共成员,例如:

  • int favorite_integer
  • 食物what_you_had_for_breakfast_this_morning
  • 字符串 capital_of_alaska
  • PhaseOfMoon when_magic_runes_will_reveal_themselves_on_the_mysterious_artifact

等等等等等等

复杂数据显示

用于以美观的方式呈现 ComplexData 实例的控件。公开单个公共成员 ComplexMember DataToDisplay。当用户设置 DataToDisplay 时,控件中的标签会自动填充适当的数据。

MultiComplexDataDisplay

使用Repeater 在一行中显示多个ComplexDataDisplay 的控件。它包含一个private List<ComplexData> datasToDisplay,它是转发器的数据源。它提供了两个公共方法,addComplexData(ComplexData)emptyAllData(),让用户可以操作 datasToDisplay。

问题

数据绑定过程中,不知道如何设置每个ComplexDataDisplay的DataToDisplay成员。

似乎转发器中的控件通常是从前端填充的,例如

<asp:Repeater runat="server" id="linkRepeater">
    <a href="<%# getUrl(Container.DataItem) %>"> <%# getDescription(Container.DataItem) %> </a>
</asp:Repeater>

据我了解,在数据绑定期间,转发器实例化每个锚元素,使用任何数据源来设置 href 和描述。

我复制这种行为的尝试只导致了一个空白页:

<asp:Repeater runat="server" id="displayRepeater">
    <ComplexDataDisplay id="dataDisplay" DataToDisplay="<%# Container.DataItem %>" runat="server"
</asp:Repeater>

我能想到的唯一另一件事是修改 ComplexDataDisplay,使其对 ComplexData 的每个成员都有一个公共成员。然后在中继器内我可以做:

<asp:Repeater runat="server" id="displayRepeater">
    <ComplexDataDisplay id="dataDisplay" runat="server"
        favorite_integer="<%# get_favorite_integer(Container.DataItem) %>"
        what_you_had_for_breakfast_this_morning="<# get_what_you_had_for_breakfast_this_morning(Container.DataItem) %>"
        <%--etc etc etc--%>
    />
</asp:Repeater>

这似乎非常不受欢迎,因为对于 ComplexData 的每个成员,我必须在 ComplexDataDisplay 中编写一个相应的公共成员,并在 MultiComplexDataDisplay 中编写一个get_whatever(DataItem) 方法。最重要的是,我什至不知道它是否会起作用,因为 ComplexData 的一半成员是复杂数据类型,可能会或可能不会以这种方式设置。

我在寻找什么答案

以下之一:

  • 直接回答 TLDR 部分中提出的问题 - 一种在数据绑定期间为中继器中的每个控件执行特殊实例化的方法,或者一种在事后不久对其进行迭代的方法。
  • 关于如何最好地重构代码的建议,以便不再需要特殊的实例化来显示我的许多复杂数据。我愿意添加/更新/删除除 ComplexData 之外的任何类,因为我有义务按原样维护其接口。
  • 与我的问题相关的最佳实践/参考/文档,它们将指导我自己寻找解决方案。

【问题讨论】:

    标签: asp.net repeater


    【解决方案1】:

    您可以在 ItemDataBound 内绑定子控件,我无法跟踪在需要时替换哪些对象:

    <asp:Repeater runat="server" id="displayRepeater" OnItemDataBound="displayRepeater_ItemDataBound">
        <uc1:ComplexDataDisplay id="dataDisplay" runat="server" />
    </asp:Repeater>
    
    
     protected void displayRepeater_ItemDataBound(Object Sender, RepeaterItemEventArgs e) 
     {
          // Execute the following logic for Items and Alternating Items.
          if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
          {
             //get object bound to row
             ComplexData c = (ComplexData)e.Item.DataItem;
             //find the child control to bind
             ComplexDataDisplay cds = (ComplexDataDisplay)e.Item.FindControl("dataDisplay");
             //set properties or any other complex things you need to do
             cds.DataToDisplay = c.ComplexMember;
             cds.DataBind(); // if this control has repeaters, it's ItemDataBound will fire, repeat this process untill all your controls are bound properly
          }
       }    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多