OVH Cloud OVH Cloud

Imbriquer 2 repeater ?_?

7 réponses
Avatar
Ryo
Salut !!!

J'ai des documents (provenant d'une table de ma base de données) et chaque
document a un Processus (la liste des processus est une autre table de la
base), je voudrais afficher la liste des documents par processus. Un truc du
genre:
Commercial____________
Doc 1
Doc 3
Informatique___________
Doc 2
Doc 6
Pour cela, j'essaye d'imbriquer 2 repeater, le premier parcourant les
différents processus et le deuxième affichant les document du processus.
J'ai donc le code suivant dans ma page:
<asp:Repeater ID="rptProcessus" OnItemCreated="ProcessusCreated"
runat="server">
<ItemTemplate>
<div class="titre"><%#Eval("NOM")%></div>

<asp:Repeater ID="rptDocuments" runat="server">
<ItemTemplate>
<asp:LinkButton ID="lkbDocument"
CommandArgument='<%#Eval("DOCUMENTS_ID")%>' OnCommand="Command"
runat="server"><%#Eval("NOM")%></asp:LinkButton><br />
</ItemTemplate>
</asp:Repeater>

</ItemTemplate>
</asp:Repeater>

Et dans le code-behind:
protected override void OnInit(EventArgs e){
rptProcessus.DataSource = new
Databases().OracleGetDataTableOfTable("PROCESSUS", null, "NOM");
rptProcessus.DataBind();

base.OnInit(e);
}

protected void ProcessusCreated(object sender, RepeaterItemEventArgs e){
(e.Item.FindControl("rptDocuments") as Repeater).DataSource = new
Databases().OracleGetDataTableOfTable("PROCESSUS", (e.Item.DataItem as
DataRowView)["PROCESSUS_ID"].ToString(), "NOM");
(e.Item.FindControl("rptDocuments") as Repeater).DataBind();
}

Et quand j'execute cette page, je prend une belle erreur dans la tete sur
cette ligne:
<asp:LinkButton ID="lkbDocument" CommandArgument='<%#Eval("DOCUMENTS_ID")%>'
OnCommand="Command" runat="server"><%#Eval("NOM")%></asp:LinkButton><br />
Me disant, que la fonction Eval() ne peux utiliser que dans un controle
databound...
Alors bon, j'ai bien des idees pour contourner ce problème, mais j'aimerai
bien le comprendre et surtout le résoudre.
Merci.

7 réponses

Avatar
Franck Quintana
Bonjour,
Essayez de remplacer vos Eval par
DataBinder.Eval(Container.DataItem, "VotreChaine")


Franck Quintana
Active+ Software
http://www.activeplus.com
Avatar
Ryo
Merci ça marche nickel !!!
D'autant plus que j'y aurais jamais pensé je crois...

"Franck Quintana" a écrit :

Bonjour,
Essayez de remplacer vos Eval par
DataBinder.Eval(Container.DataItem, "VotreChaine")


Franck Quintana
Active+ Software
http://www.activeplus.com



Avatar
Franck Quintana
J'avais trouvé la syntaxe un peu obscure aussi.
Bon après on s'y fait :)
Content que cela ait pu vous aider.

Franck Quintana
Active+ Software
http://www.activeplus.com
Avatar
Franck Quintana
J'avais trouvé la syntaxe un peu obscure aussi.
Bon après on s'y fait :)
Content que cela ait pu vous aider.

Franck Quintana
Active+ Software
http://www.activeplus.com
Avatar
Patrice
Pas directement lié à ton problème mais cet article peut t'intéresser (je
n'ai pas trouvé l'article équivalent en C# et en français) :
http://support.microsoft.com/kb/326338/en-us

(Reperater imbiqués utilisant une relation entre DataTable, la source de
données du repeater interne étant elle-même issue d'une expression de
databinding exploitant cette relation)

--
Patrice

"Ryo" a écrit dans le message de
news:
Salut !!!

J'ai des documents (provenant d'une table de ma base de données) et chaque
document a un Processus (la liste des processus est une autre table de la
base), je voudrais afficher la liste des documents par processus. Un truc


du
genre:
Commercial____________
Doc 1
Doc 3
Informatique___________
Doc 2
Doc 6
Pour cela, j'essaye d'imbriquer 2 repeater, le premier parcourant les
différents processus et le deuxième affichant les document du processus.
J'ai donc le code suivant dans ma page:
<asp:Repeater ID="rptProcessus" OnItemCreated="ProcessusCreated"
runat="server">
<ItemTemplate>
<div class="titre"><%#Eval("NOM")%></div>

<asp:Repeater ID="rptDocuments" runat="server">
<ItemTemplate>
<asp:LinkButton ID="lkbDocument"
CommandArgument='<%#Eval("DOCUMENTS_ID")%>' OnCommand="Command"
runat="server"><%#Eval("NOM")%></asp:LinkButton><br />
</ItemTemplate>
</asp:Repeater>

</ItemTemplate>
</asp:Repeater>

Et dans le code-behind:
protected override void OnInit(EventArgs e){
rptProcessus.DataSource = new
Databases().OracleGetDataTableOfTable("PROCESSUS", null, "NOM");
rptProcessus.DataBind();

base.OnInit(e);
}

protected void ProcessusCreated(object sender, RepeaterItemEventArgs e){
(e.Item.FindControl("rptDocuments") as Repeater).DataSource = new
Databases().OracleGetDataTableOfTable("PROCESSUS", (e.Item.DataItem as
DataRowView)["PROCESSUS_ID"].ToString(), "NOM");
(e.Item.FindControl("rptDocuments") as Repeater).DataBind();
}

Et quand j'execute cette page, je prend une belle erreur dans la tete sur
cette ligne:
<asp:LinkButton ID="lkbDocument"


CommandArgument='<%#Eval("DOCUMENTS_ID")%>'
OnCommand="Command" runat="server"><%#Eval("NOM")%></asp:LinkButton><br />
Me disant, que la fonction Eval() ne peux utiliser que dans un controle
databound...
Alors bon, j'ai bien des idees pour contourner ce problème, mais j'aimerai
bien le comprendre et surtout le résoudre.
Merci.


Avatar
Ryo
Article fort intéressant qui présente une approche un peu différente de la
mienne et à laquelle je n'avais pas pensé.
Merci.

"Patrice" a écrit :

Pas directement lié à ton problème mais cet article peut t'intéresser (je
n'ai pas trouvé l'article équivalent en C# et en français) :
http://support.microsoft.com/kb/326338/en-us

(Reperater imbiqués utilisant une relation entre DataTable, la source de
données du repeater interne étant elle-même issue d'une expression de
databinding exploitant cette relation)

--
Patrice

"Ryo" a écrit dans le message de
news:
> Salut !!!
>
> J'ai des documents (provenant d'une table de ma base de données) et chaque
> document a un Processus (la liste des processus est une autre table de la
> base), je voudrais afficher la liste des documents par processus. Un truc
du
> genre:
> Commercial____________
> Doc 1
> Doc 3
> Informatique___________
> Doc 2
> Doc 6
> Pour cela, j'essaye d'imbriquer 2 repeater, le premier parcourant les
> différents processus et le deuxième affichant les document du processus.
> J'ai donc le code suivant dans ma page:
> <asp:Repeater ID="rptProcessus" OnItemCreated="ProcessusCreated"
> runat="server">
> <ItemTemplate>
> <div class="titre"><%#Eval("NOM")%></div>
>
> <asp:Repeater ID="rptDocuments" runat="server">
> <ItemTemplate>
> <asp:LinkButton ID="lkbDocument"
> CommandArgument='<%#Eval("DOCUMENTS_ID")%>' OnCommand="Command"
> runat="server"><%#Eval("NOM")%></asp:LinkButton><br />
> </ItemTemplate>
> </asp:Repeater>
>
> </ItemTemplate>
> </asp:Repeater>
>
> Et dans le code-behind:
> protected override void OnInit(EventArgs e){
> rptProcessus.DataSource = new
> Databases().OracleGetDataTableOfTable("PROCESSUS", null, "NOM");
> rptProcessus.DataBind();
>
> base.OnInit(e);
> }
>
> protected void ProcessusCreated(object sender, RepeaterItemEventArgs e){
> (e.Item.FindControl("rptDocuments") as Repeater).DataSource = new
> Databases().OracleGetDataTableOfTable("PROCESSUS", (e.Item.DataItem as
> DataRowView)["PROCESSUS_ID"].ToString(), "NOM");
> (e.Item.FindControl("rptDocuments") as Repeater).DataBind();
> }
>
> Et quand j'execute cette page, je prend une belle erreur dans la tete sur
> cette ligne:
> <asp:LinkButton ID="lkbDocument"
CommandArgument='<%#Eval("DOCUMENTS_ID")%>'
> OnCommand="Command" runat="server"><%#Eval("NOM")%></asp:LinkButton><br />
> Me disant, que la fonction Eval() ne peux utiliser que dans un controle
> databound...
> Alors bon, j'ai bien des idees pour contourner ce problème, mais j'aimerai
> bien le comprendre et surtout le résoudre.
> Merci.





Avatar
Ryo
Article fort intéressant qui présente une approche un peu différente de la
mienne et à laquelle je n'avais pas pensé.
Merci.

"Patrice" a écrit :

Pas directement lié à ton problème mais cet article peut t'intéresser (je
n'ai pas trouvé l'article équivalent en C# et en français) :
http://support.microsoft.com/kb/326338/en-us

(Reperater imbiqués utilisant une relation entre DataTable, la source de
données du repeater interne étant elle-même issue d'une expression de
databinding exploitant cette relation)

--
Patrice

"Ryo" a écrit dans le message de
news:
> Salut !!!
>
> J'ai des documents (provenant d'une table de ma base de données) et chaque
> document a un Processus (la liste des processus est une autre table de la
> base), je voudrais afficher la liste des documents par processus. Un truc
du
> genre:
> Commercial____________
> Doc 1
> Doc 3
> Informatique___________
> Doc 2
> Doc 6
> Pour cela, j'essaye d'imbriquer 2 repeater, le premier parcourant les
> différents processus et le deuxième affichant les document du processus.
> J'ai donc le code suivant dans ma page:
> <asp:Repeater ID="rptProcessus" OnItemCreated="ProcessusCreated"
> runat="server">
> <ItemTemplate>
> <div class="titre"><%#Eval("NOM")%></div>
>
> <asp:Repeater ID="rptDocuments" runat="server">
> <ItemTemplate>
> <asp:LinkButton ID="lkbDocument"
> CommandArgument='<%#Eval("DOCUMENTS_ID")%>' OnCommand="Command"
> runat="server"><%#Eval("NOM")%></asp:LinkButton><br />
> </ItemTemplate>
> </asp:Repeater>
>
> </ItemTemplate>
> </asp:Repeater>
>
> Et dans le code-behind:
> protected override void OnInit(EventArgs e){
> rptProcessus.DataSource = new
> Databases().OracleGetDataTableOfTable("PROCESSUS", null, "NOM");
> rptProcessus.DataBind();
>
> base.OnInit(e);
> }
>
> protected void ProcessusCreated(object sender, RepeaterItemEventArgs e){
> (e.Item.FindControl("rptDocuments") as Repeater).DataSource = new
> Databases().OracleGetDataTableOfTable("PROCESSUS", (e.Item.DataItem as
> DataRowView)["PROCESSUS_ID"].ToString(), "NOM");
> (e.Item.FindControl("rptDocuments") as Repeater).DataBind();
> }
>
> Et quand j'execute cette page, je prend une belle erreur dans la tete sur
> cette ligne:
> <asp:LinkButton ID="lkbDocument"
CommandArgument='<%#Eval("DOCUMENTS_ID")%>'
> OnCommand="Command" runat="server"><%#Eval("NOM")%></asp:LinkButton><br />
> Me disant, que la fonction Eval() ne peux utiliser que dans un controle
> databound...
> Alors bon, j'ai bien des idees pour contourner ce problème, mais j'aimerai
> bien le comprendre et surtout le résoudre.
> Merci.