访问父级 Repeater 的 DataItem 属性

7
我有一个控件,其中包含一个名为rptReferrals的Repeater。rptReferrals遍历一个Entity对象Referrals列表。Referrals对象引用了另一张表Answers,其中存储了用户提交的答案列表。rptReferrals会将子Repeater rptQuestionnaire绑定到一个问题列表上,这个问题列表是与Referrals对象不相关联的,而是与我登录的人相关联的。
以下是aspx代码:
<asp:Repeater runat="server" ID="rptReferrals" OnItemDataBound="rptReferrals_OnItemDataBound">
    <ItemTemplate>
        //some HTML for the referral object
        <asp:Repeater runat="server" ID="rptQuestionnaire" OnItemDataBound="rptQuestionnaire_OnItemDataBound">
              //some HTML for displaying questions and answers
        </asp:Repeater>
    </ItemTemplate>
 </asp:Repeater>

后端代码:
protected void rptReferrals_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
         //THIS IS THE ITEM THAT HAS THE LIST OF ANSWERS I NEED
         var data = e.Item.DataItem as PatientReferral;
         var rptQuestionnaire = e.Item.FindControl("rptQuestionnaire") as Repeater;
         rptQuestionnaire.DataSource = QuestionList;   
         rptQuestionnaire.DataBind();

         //QuestionList is a list of questions populated on page load.
         // I can't bind to the property of data.Answers because not
         //all questions are answered. data.Answers is only a list of 
         //the questions answered
    }
}

protected void rptQuestionnaire_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
       Need to access the data.Answers object from above. HOW????
    }
}

我遇到的问题是问题列表不是必须的,而我需要显示所有的问题,无论用户是否回答过。但如果他们回答了,我需要显示答案,这是附加到rptReferrals的属性。

你有什么好的想法来访问我的父级重复器数据项的属性吗?此时我愿意接受任何答案。


我几周前遇到了这个问题,然后提出了一个问题。点击这里查看。 - Jack Pettinger
我会将外部重复器的内容放入一个单独的用户控件中,然后您可以为数据项指定任何名称的属性。总的来说,我认为这是个好主意,因为让“Container.DataItem”引用两个不同的东西会令人困惑。 - millimoose
1个回答

12

您可以使用.Parent属性来获取RepeaterItem控件的外层RepeaterItem(因此也可以获取到其DataItem)。

看起来像是这样可以工作:

protected void rptQuestionnaire_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
       Repeater currentRepeater = (Repeater)sender;
       // Note that you might only need one ".Parent" here.  Or you might need
       // more, depends on your actual markup.
       var data = ((RepeaterItem)e.Item.Parent.Parent).DataItem as PatientReferral;
       // Now you have access to data.Answers from the parent Repeater
    }
}

我会尝试一下,看看效果如何!谢谢! - Icestorm0141
@Icestorm0141 很高兴能帮到你 =) 我想你可能需要微调那部分。 - Josh Darnell
5
如果您使用.NamingContainer而不是.Parent.Parent,它将找到当前repeater并忽略任何htmlgenericcontrols。因此,您可以使用.NamingContainer.NamingContainer来查找子控件的父级repeater。 - Anicho
1
@Anicho 很有趣!我从未使用过那个属性。谢谢你指出来,这是另一个不错的选择 =) - Josh Darnell
很棒的东西。+1并向Anicho的推荐再加一分。 - Lukas
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接