gpt4 book ai didi

asp.net - 在 Repeater 中设置控件的复杂成员

转载 作者:行者123 更新时间:2023-12-02 00:29:16 25 4
gpt4 key购买 nike

长话短说

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

设置

我有三个类(class):

复杂数据

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

  • int favorite_integer
  • 今天早上吃什么早餐吃什么
  • 字符串 capital_of_alaska
  • PhaseOfMoon when_magic_runes_will_reveal_themselves_on_the_mysterious_artifact

等等等等

复杂数据显示

用于以美观的方式呈现 ComplexData 实例的控件。公开一个公共(public)成员,ComplexMember DataToDisplay .当用户设置 DataToDisplay 时,控件内的标签将用适当的数据填充自己。

多复杂数据显示

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

问题

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

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

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

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

我尝试复制此行为只会导致空白页:

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

我唯一想尝试的另一件事是修改 ComplexDataDisplay,使 ComplexData 的每个成员都有一个公共(public)成员。然后在转发器中我可以做:

<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 中编写一个相应的公共(public)成员,以及一个 get_whatever(DataItem) MultiComplexDataDisplay 中的方法。最重要的是,我什至不知道它是否会起作用,因为 ComplexData 的一半成员是复杂数据类型,可能无法以这种方式设置。

我在寻找答案

以下之一:

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

最佳答案

您可以在 ItemDataBound 中绑定(bind)您的子控件,我无法了解绑定(bind)了哪些对象,所以在需要的地方替换:

<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
}
}

关于asp.net - 在 Repeater 中设置控件的复杂成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7667242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com