在 Repeater 中设置控件的复杂成员

Setting complex members of a control inside a Repeater

提问人:Kevin 提问时间:10/6/2011 更新时间:10/6/2011 访问量:646

问:

TL的;博士

我的 Repeater 中的控件需要特殊的实例化才能派上用场。如何对每个控件执行此特殊实例化,因为它们是由中继器构造的?

设置

我有三个班级:

复杂数据

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

  • int favorite_integer
  • 食品what_you_had_for_breakfast_this_morning
  • 字符串capital_of_alaska
  • 月相when_magic_runes_will_reveal_themselves_on_the_mysterious_artifact

等等,等等,等等

ComplexDataDisplay(复杂数据显示)

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

MultiComplexDataDisplay(多复杂数据显示)

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

问题

在数据绑定过程中,我不知道如何设置每个 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 中编写方法。最重要的是,我什至不知道它是否有效,因为 ComplexData 的一半成员是复杂的数据类型,它们可能以这种方式设置,也可能不可用。get_whatever(DataItem)

我在答案中寻找什么

以下其中一项:

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

评论


答:

3赞 rick schott 10/6/2011 #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
      }
   }