Ik heb moeite om een specifiek geval van een nested repeater werkend te krijgen. De manier (gegevens ophalen, in dataset plaatsen, relaties leggen etc) is allemaal geen probleem - namelijk niet de eerste keer dat ik zou iets doe maar met deze krijg ik "The relation is not parented to the table to which this DataView points."
Ik heb 3 tabellen (mssql2000):
tblGroepen (GroepId, GroepNaam)
1 - Groep A
2 - Groep B
3 - Groep C
tblAuteurs (AuteurId, AuteurNaam)
1 - Auteur A
2 - Auteur B
3 - Auteur C
tblGroepenAuteurs (fkGroepId, fkAuteurId) (met clusted unique index) erop zodat een auteur in meerdere groepen kan zitten
1 - 1
1 - 3
2 - 2
2 - 1
3 - 3
relatie tblgroepen -> tblgroepenauteurs = 1 op veel
relatie tblauteurs -> tblgroepenauteurs = 1 op veel
Ik haal op tblAuteurs en een nieuwe tabel die als volgt is samen gesteld (tblGroepenJoined):
Levert me de volgende lijst op:
1 - 1 - Groep A
1 - 3 - Groep A
2 - 2 - Groep B
2 - 1 - Groep B
3 - 3 - Groep C
Dit moet genoeg zijn voor de nested repeaters
De relatie die in regel 8 wordt gedefinieerd koppelt tblAuteurs.AuteurId aan de gejoinde tblGroepenJoined.fk_AuteurId. repAuteurs_ItemDataBound regelt dat bij iedere rij die de repAuteurs maakt (uit de tblAuteurs) de rijen uit tblGroepenJoined waarin fk_AuteurId = AuteurId. Als ik de stacktrace mag geloven treedt de fout op in regel 25.
Heeft iemand een idee waarom dit niet werkt. Alles is volgens mij volgens de regels gedaan...
In asp.net gebeurd het volgende:
repeaters (troep weer weggelaten:
Ik heb 3 tabellen (mssql2000):
tblGroepen (GroepId, GroepNaam)
1 - Groep A
2 - Groep B
3 - Groep C
tblAuteurs (AuteurId, AuteurNaam)
1 - Auteur A
2 - Auteur B
3 - Auteur C
tblGroepenAuteurs (fkGroepId, fkAuteurId) (met clusted unique index) erop zodat een auteur in meerdere groepen kan zitten
1 - 1
1 - 3
2 - 2
2 - 1
3 - 3
relatie tblgroepen -> tblgroepenauteurs = 1 op veel
relatie tblauteurs -> tblgroepenauteurs = 1 op veel
Ik haal op tblAuteurs en een nieuwe tabel die als volgt is samen gesteld (tblGroepenJoined):
SQL:
1
2
| select GroepId, fk_AuteurId, GroepNaam from tblGroepen inner join tblGroepenAuteurs on tblGroepen.GroepId = tblGroepenAuteurs.fk_GroepId |
Levert me de volgende lijst op:
1 - 1 - Groep A
1 - 3 - Groep A
2 - 2 - Groep B
2 - 1 - Groep B
3 - 3 - Groep C
Dit moet genoeg zijn voor de nested repeaters
De relatie die in regel 8 wordt gedefinieerd koppelt tblAuteurs.AuteurId aan de gejoinde tblGroepenJoined.fk_AuteurId. repAuteurs_ItemDataBound regelt dat bij iedere rij die de repAuteurs maakt (uit de tblAuteurs) de rijen uit tblGroepenJoined waarin fk_AuteurId = AuteurId. Als ik de stacktrace mag geloven treedt de fout op in regel 25.
Heeft iemand een idee waarom dit niet werkt. Alles is volgens mij volgens de regels gedaan...
In asp.net gebeurd het volgende:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| Page_Load() { DataSet dSet= new DataSet() // code voor ophalen gegevens zijn weggelaten dSet.Tables[0].TableName = "tblAuteurs"; dSet.Tables[1].TableName = "tblGroepenJoined"; // inner join tblGroepen en tblGroepenAuteurs // relaties leggen dSet.Relations.Add("relAuteur",dSet.Tables["tblAuteurs"].Columns["AuteurId"],dSet.Tables["tblGroepenJoined"].Columns["fk_AuteurId"]); // bind eerste repeater repAuteurs.DataSource = dSet.Tables["tblAuteurs"]; repAuteurs.DataBind(); } protected void repAuteurs_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e) { ListItemType lt = e.Item.ItemType; if(lt == ListItemType.Item || lt == ListItemType.AlternatingItem) { DataRowView dv = e.Item.DataItem as DataRowView; if(dv != null) { Repeater nestedRepeater = e.Item.FindControl("repGroepen") as Repeater; if (nestedRepeater != null) { nestedRepeater.DataSource = dv.CreateChildView("relAuteurs"); nestedRepeater.DataBind(); } } } } private void InitializeComponent() { // overige events weggelaten this.repAuteurs.ItemDataBound += new System.Web.UI.WebControls.RepeaterItemEventHandler(this.repAuteurs_ItemDataBound); // itemdatabound event toevoegen } |
repeaters (troep weer weggelaten:
HTML:
1
2
3
4
5
6
7
8
9
10
| <asp:Repeater id="repAuteurs" runat="server" > <ItemTemplate> <%# DataBinder.Eval(Container, "DataItem.AuteurNaam") %> <asp:repeater id="repGroepen" runat="server"> <ItemTemplate> <%# DataBinder.Eval(Container, "DataItem.GroepNaam") %></td> </ItemTemplate> </asp:repeater> </ItemTemplate> </asp:Repeater> |