Asp.net 在中继器内设置控件的复杂成员 TL;博士

Asp.net 在中继器内设置控件的复杂成员 TL;博士,asp.net,repeater,Asp.net,Repeater,我的中继器中的控件需要特殊实例化才能发挥作用。在中继器构造每个控件时,如何对其执行此特殊实例化 设置 我有三门课: 复杂数据 包含许多不同类型的公共成员,例如: 整数 食物你今天早上早餐吃了什么 阿拉斯加州弦首府 相位月亮当你的魔法符文会在神秘的神器上展示你自己 等等等等等等 ComplexDataDisplay 用于以美观的方式呈现ComplexData实例的控件。公开单个公共成员,ComplexMember数据显示。当用户将数据设置为显示时,控件内的标签将使用适当的数据填充自己 多复杂数

我的中继器中的控件需要特殊实例化才能发挥作用。在中继器构造每个控件时,如何对其执行此特殊实例化

设置 我有三门课:

复杂数据

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

  • 整数
  • 食物你今天早上早餐吃了什么
  • 阿拉斯加州弦首府
  • 相位月亮当你的魔法符文会在神秘的神器上展示你自己
等等等等等等

ComplexDataDisplay

用于以美观的方式呈现ComplexData实例的控件。公开单个公共成员,
ComplexMember数据显示
。当用户将数据设置为显示时,控件内的标签将使用适当的数据填充自己

多复杂数据显示

一种控件,它使用中继器在一行中显示多个ComplexDataDisplays。它包含一个
专用列表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>

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

我在寻找答案 以下其中一项:

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

受保护的void displayRepeater\u ItemDataBound(对象发送方,RepeaterItemEventArgs e)
{
//对项目和交替项目执行以下逻辑。
如果(e.Item.ItemType==ListItemType.Item | | e.Item.ItemType==ListItemType.AlternatingItem)
{
//将对象绑定到行
ComplexData c=(ComplexData)e.Item.DataItem;
//查找要绑定的子控件
ComplexDataDisplay cds=(ComplexDataDisplay)e.Item.FindControl(“数据显示”);
//设置属性或您需要执行的任何其他复杂操作
cds.DataToDisplay=c.ComplexMember;
cds.DataBind();//如果此控件有转发器,则会触发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
      }
   }