2013-03-14 12 views
6

Ich habe ein Steuerelement, das über einen Repeater verfügt, rptReferrals, der eine Liste von Entity-Objekten, Referrals durchläuft. Das Referrals-Objekt verweist auf eine andere Tabelle namens Answers, die eine Liste der Antworten enthält, die für den Benutzer gesendet wurden. rptReferrals bindet einen Child-Repeater, rptQuestionnaire, an eine Liste von Fragen für die Person, mit der ich angemeldet bin, die nicht mit dem Referrals-Objekt verbunden ist, an das sie gebunden ist. HierZugriff auf übergeordnete Repeater DataItem-Eigenschaft

ist der aspx-Code:

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

Der Backend-Code:

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

Das Problem, das ich habe, ist, dass die Liste der Fragen sind nicht erforderlich, und ich brauche alle Fragen angezeigt werden unabhängig davon, ob der Benutzer sie beantwortet hat oder nicht. Aber wenn sie es beantwortet haben, muss ich die Antwort anzeigen, welche die Eigenschaft ist, die an rptReferrals angehängt ist.

Haben Sie Ideen, wie Sie auf eine Eigenschaft des Datenelements meines übergeordneten Repeaters zugreifen können? Ich werde an dieser Stelle keine Antwort geben.

+0

ich vor ein paar Wochen hatte dieses Problem und eine Frage gestellt. [Hier prüfen] (http://stackoverflow.com/questions/15137029/accessing-a-nested-repeaters-datasource) –

+0

Ich würde den Inhalt des äußeren Repeater in ein separates Benutzersteuerelement legen, dann können Sie es geben Eigenschaft mit dem gewünschten Namen für das Datenelement. Ich würde sagen, dass es im Allgemeinen eine gute Idee ist, da der Name 'Container.DataItem' sich auf zwei verschiedene Dinge bezieht, ist verwirrend. – millimoose

Antwort

10

Sie können das .Parent Attribut des RepeaterItem Kontrolle Sie sich bis zu den äußeren RepeaterItem arbeiten (und damit seine DataItem).

Scheint, wie dies funktionieren würde:

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

Ich werde es versuchen und sehen, wie es geht! Vielen Dank! – Icestorm0141

+1

@ Icestorm0141 Viel Glück, lassen Sie mich wissen, wie es geht! – jadarnel27

+0

Das hat perfekt funktioniert !!! Basierend auf meinem tatsächlichen Markup musste ich die Anzahl von ".Parent" ändern, aber es hat funktioniert! Vielen Dank! – Icestorm0141