提问人:Kevin 提问时间:10/6/2011 更新时间:10/6/2011 访问量:646
在 Repeater 中设置控件的复杂成员
Setting complex members of a control inside a Repeater
问:
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> datasToDisplay
addComplexData(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 之外的任何类,因为我有义务按原样维护其接口。
- 与我的问题相关的最佳实践/参考/文档,这将指导我自己找到解决方案。
答:
您可以在其中绑定子控件,我无法跟踪哪些对象在需要时进行替换: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
}
}
评论