IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

[C# + ASP.NET + Entity Framework] Générer une liste à partir d'une requête d'éléments groupés


Sujet :

ASP.NET

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 8
    Points : 1
    Points
    1
    Par défaut [C# + ASP.NET + Entity Framework] Générer une liste à partir d'une requête d'éléments groupés
    Salut !
    Je débute la programmation ASP.NET et pour m'entraîner j'essaie d'afficher des données en liste.
    J'ai donc créé une solution avec d'abord deux projets : un d'acès aux données, et un d'affichage des données en console(Program.cs). Concrètement ça donne ça :
    Nom : console.png
Affichages : 430
Taille : 37,3 Ko

    Comme ça marchait en console et que j'étais content j'ai voulu utiliser ASP.NET mais voilà, je bloque pour générer des listes. J'ai commencé à faire ça :
    Default.aspx
    Default.aspx.cs
    Pourriez-vous m'aider ? Je cherche à faire une seule liste sur ce modèle :
    • L'artiste XX a XX albums (ou album si < 1) :
      • XX, qui coûte XX euros (ou euro) ;
      • XX, qui coûte XX euros (ou euro) ;
      • XX, qui coûte XX euros (ou euro) ;
      • XX, qui coûte XX euros (ou euro) ;
    • L'artiste XX a XX albums (ou album si < 1) :
      • XX, qui coûte XX euros (ou euro) ;
      • XX, qui coûte XX euros (ou euro) ;
      • XX, qui coûte XX euros (ou euro) ;
      • XX, qui coûte XX euros (ou euro) ;

  2. #2
    Membre éprouvé
    Avatar de dkmix
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    619
    Détails du profil
    Informations personnelles :
    Localisation : Jamaïque

    Informations forums :
    Inscription : Septembre 2007
    Messages : 619
    Points : 924
    Points
    924
    Par défaut
    Quel est le message d'erreur ? Pile d'appel ?

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Merci de me répondre !
    Il n'y a pas d'erreur, c'est simplement que je ne vois pas comment faire :-( :
    • En appellant en dur le premier artiste je peux afficher tout ses albums, je peux avoir une liste de tout les artistes mais je ne sais pas mettre les deux ensembles ;
    • J'ai voulu modifier dynamiquement la requête (les deux derniers champs) mais la page reste statique ;
    S'il y a une erreur, elle est dans ma tête

  4. #4
    Membre éprouvé
    Avatar de dkmix
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    619
    Détails du profil
    Informations personnelles :
    Localisation : Jamaïque

    Informations forums :
    Inscription : Septembre 2007
    Messages : 619
    Points : 924
    Points
    924
    Par défaut
    Surement rien à voir... mais si tu débute en asp.net, je t'invite à te diriger directement vers de l'ASP.NET MVC (3 ou 4), il y a pas mal de tuto (chez Developpez ou autres).

    Perso je n'aime pas du tout les cycles de vies et autres bizarreries de l'asp.
    En ASP.NET MVC on est dans une logique MVC "standard".

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Tu as raison, mais je pense que mon problème ne changera pas

  6. #6
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 220
    Points : 268
    Points
    268
    Par défaut
    Tu ne pourrais pas stocker tes résultats dans un DataTable par exemple et l'utiliser comme DataSource sur un repeater dans lequel tu fait ta mise en forme?

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Merci, j'ai l'impression que ça pourrait marcher. Je débute :/ tu pourrais me montrer un bout de code ou une page qui explique comment utiliser les objets que tu cites ?

  8. #8
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 220
    Points : 268
    Points
    268
    Par défaut
    Ben tu stockes le résultat de ta requête dans un DataAdapter que tu utilises pour remplir un DataTable que tu réutilises comme datasource de ton repeater:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    string queryString = 
      "SELECT CustomerID, CompanyName FROM dbo.Customers";
    SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);
     
    DataSet customers = new DataSet();
    adapter.Fill(customers);
    Repeater1.DataSource = customers;
    Repeater1.DataBind();
    Et tu utilises les valeurs de ta datasource dans ton repeater coté ascx:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    <asp:Repeater ID="Repeater1" runat="server">
    <HeaderTemplate>
        <ul>
        <asp:Label ID="Label4"  runat="server" Text="Je Suis" BackColor="DarkOrange" ForeColor="White" Width="50%" BorderWidth="1px" ></asp:Label>
     
        <br></br>
     
    </HeaderTemplate>
    <ItemTemplate>
    <li>    
        <a href='<%# DataBinder.Eval(Container.DataItem,"CompanyName")%>'><%# DataBinder.Eval(Container.DataItem,"CustomerID")%></a>
    </li>
    </ItemTemplate>
     
    <FooterTemplate></ul></FooterTemplate>
     
    </asp:Repeater>
    Tu peux jeter un oeil ici c'est peut-être plus clair: http://dotnet-wpf.blogspot.fr/2008/0...prepeater.html

    Pour ton problème, je pense que tu devras Utiliser 2 requêtes et 2 repeaters imbriqués. L'un pour les artistes, l'autre pour les albums de chaque artiste

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup de ta réponse !!
    Le "groupBy" me pose problème : je peux afficher ses clefs (donc la liste des artistes) mais après je ne vois pas comment afficher les albums associés :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Les artistes sont :
        <asp:ListView runat="server" ID="lvArtists" ItemPlaceholderID="items">
            <LayoutTemplate>
                <ul>
                    <asp:PlaceHolder runat="server" ID="items" />
                </ul>
            </LayoutTemplate>
            <ItemTemplate>
                <li>L artiste
                    <%# Eval("Key") %>
                    détient
                    <asp:Literal runat="server" ID="ltAlbumCount" />
                    album(s) qui sont ??? </li>
            </ItemTemplate>
        </asp:ListView>

  10. #10
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 220
    Points : 268
    Points
    268
    Par défaut
    C'est pour ca que je te disais qu'il faudrait sûrement utiliser 2 repeaters imbriqués.

    Tu fais ta première requête comme tu le fais actuellement pour récupérer les artistes.
    Puis tu parcours ces résultats pour en ressortir les albums associés.
    du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    foreach(DataRow row in DataTableArtistes.Rows)
    {
    // là tu fais ta requête pour récupérer les albums de l'artiste dont l'id artiste est row[numéro_de_la_colonne_ID]
    //puis tu récupères les resultats de la même façon que pour les artistes avec le DataAdapter etc...
    }

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Je te suis reconnaissant de m'aider :-)
    J'essaie et je te tiens au courant.

  12. #12
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Je n'ai pas trouvé comment utiliser les DataXX donc en code de page j'ai mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
        <asp:ListView runat="server" ID="lvArtOk" ItemPlaceholderID="items">
            <LayoutTemplate>
                <ul>
                    <asp:PlaceHolder runat="server" ID="items" />
                </ul>
            </LayoutTemplate>
            <ItemTemplate>
                <li>Nom de l artiste :
                    <%# Eval("Name") %>
            </ItemTemplate>
        </asp:ListView>
        <%--
     
        --%>
        <asp:ListView runat="server" ID="lvAlbEach" ItemPlaceholderID="items">
            <LayoutTemplate>
                <ul>
                    <asp:PlaceHolder runat="server" ID="items" />
                </ul>
            </LayoutTemplate>
            <ItemTemplate>
                <li><%# Eval( "Title") %></li>
            </ItemTemplate>
        </asp:ListView>
    et en code behind :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
                    // Sélection des artistes répondant à la requête
                    var artOk = context
                        .Albums.Where(a => a.Artist.Albums.Count() >= albumMin && a.Artist.Albums.Count() <= albumMax)
                        .Select(a => new { a.Artist.Name }); // Si l'on se passe d'un objet, comment atteindre Name ?
     
                    // Sélection des albums associés
                    var albEach = new ArrayList();
                    for (int i = 0; i < artOk.Count(); i++)
                    {
                        albEach.Add(context
                            .Albums
                            .Where(
                                a => a.Artist.Albums.Count() >= albumMin &&
                                a.Artist.Albums.Count() <= albumMax &&
                                a.Artist.Name == artOk.ToArray()[i].Name)
                            .Select(a => new { Title = a.Title })
                            );
                    }
     
                    lvArtOk.DataSource = artOk;
                    lvArtOk.DataBind();
     
                    lvAlbEach.DataSource = albEach;
                    lvAlbEach.DataBind();
    mais ça ne marche pas, j'ai une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    Erreur du serveur dans l'application '/'.
    --------------------------------------------------------------------------------
     
     
     DataBinding : 'System.Data.Objects.ObjectQuery`1[[<>f__AnonymousType2`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], MusicStore.Web.Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' ne comporte pas de propriété appelée 'Title'. 
    Description : Une exception non gérée s'est produite au moment de l'exécution de la requête Web actuelle. Contrôlez la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code. 
     
    Détails de l'exception: System.Web.HttpException: DataBinding : 'System.Data.Objects.ObjectQuery`1[[<>f__AnonymousType2`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], MusicStore.Web.Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' ne comporte pas de propriété appelée 'Title'.
     
    Erreur source: 
     
     
     
     
     
    Ligne 82 :         </LayoutTemplate>
    Ligne 83 :         <ItemTemplate>
    Ligne 84 :             <li><%# Eval( "Title") %></li>
    Ligne 85 :         </ItemTemplate>
    Ligne 86 :     </asp:ListView> 
     
    Fichier source : c:\Users\pdeboisset\Documents\Visual Studio 2010\Projects\MusicStore\MusicStore.Web.Test\Default.aspx    Ligne : 84 
     
    Trace de la pile: 
     
     
     
     
     
    [HttpException (0x80004005): DataBinding : 'System.Data.Objects.ObjectQuery`1[[<>f__AnonymousType2`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], MusicStore.Web.Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' ne comporte pas de propriété appelée 'Title'.]
       System.Web.UI.DataBinder.GetPropertyValue(Object container, String propName) +9499913
       System.Web.UI.DataBinder.Eval(Object container, String[] expressionParts) +94
       System.Web.UI.DataBinder.Eval(Object container, String expression) +93
       System.Web.UI.TemplateControl.Eval(String expression) +43
       ASP.default_aspx.__DataBind__control40(Object sender, EventArgs e) in c:\Users\pdeboisset\Documents\Visual Studio 2010\Projects\MusicStore\MusicStore.Web.Test\Default.aspx:84
       System.Web.UI.Control.OnDataBinding(EventArgs e) +92
       System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) +85
       System.Web.UI.Control.DataBind() +15
       System.Web.UI.Control.DataBindChildren() +187
       System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) +94
       System.Web.UI.Control.DataBind() +15
       System.Web.UI.WebControls.ListView.CreateItemsWithoutGroups(ListViewPagedDataSource dataSource, Boolean dataBinding, InsertItemPosition insertPosition, ArrayList keyArray) +826
       System.Web.UI.WebControls.ListView.CreateChildControls(IEnumerable dataSource, Boolean dataBinding) +1061
       System.Web.UI.WebControls.ListView.PerformDataBinding(IEnumerable data) +44
       System.Web.UI.WebControls.DataBoundControl.OnDataSourceViewSelectCallback(IEnumerable data) +123
       System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback) +33
       System.Web.UI.WebControls.DataBoundControl.PerformSelect() +138
       System.Web.UI.WebControls.ListView.PerformSelect() +101
       System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +30
       MusicStore.Web.Test.Default.Page_Load(Object sender, EventArgs e) in C:\Users\pdeboisset\documents\visual studio 2010\Projects\MusicStore\MusicStore.Web.Test\Default.aspx.cs:100
       System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +51
       System.Web.UI.Control.OnLoad(EventArgs e) +92
       System.Web.UI.Control.LoadRecursive() +54
       System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +670
     
     
     
    --------------------------------------------------------------------------------
    Informations sur la version : Version Microsoft .NET Framework :4.0.30319; Version ASP.NET :4.0.30319.17626

  13. #13
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 220
    Points : 268
    Points
    268
    Par défaut
    Et si tu fais un truc dans le genre?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    // Sélection des artistes répondant à la requête
                    var artOk = context
                        .Albums.Where(a => a.Artist.Albums.Count() >= albumMin && a.Artist.Albums.Count() <= albumMax)
                        .Select(a => new { a.Artist.Name }); // Si l'on se passe d'un objet, comment atteindre Name ?
    var albEach;
    foreach (var item in artOk)
    {
    albEach = context
    .Albums
    .Where(
     a => a.Artist.Albums.Count() >= albumMin &&
     a.Artist.Albums.Count() <= albumMax &&
    a.Artist.Name == artOk.ToArray()[i].Name)
    .Select(a => new { Title = a.Title })
    }
    DataTable albEachTable = albEach.CopyToDataTable()
    lvAlbEach.DataSource = albEachTable;
    lvAlbEach.DataBind();

    C'est juste une idée, j'ai pas testé.

    Sinon pour tes repeaters ou pluto listview, il faut que le lvAlbEach soit DANS le lvArtOk dans le ItemTemplate juste après <%# Eval("Name") %>
    Sinon tu auras une liste avec l'ensemble de tes Artistes et une autre avec les albums groupés par artistes.

  14. #14
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    C'est aussi ce que je me dit, mais quand je mets ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
        <asp:ListView runat="server" ID="lvArtOk" ItemPlaceholderID="items">
            <LayoutTemplate>
                <ul>
                    <asp:PlaceHolder runat="server" ID="items" />
                </ul>
            </LayoutTemplate>
            <ItemTemplate>
                <li>Nom de l artiste :
                    <%# Eval("Name") %>
                    <br />
                    Essai
                    <br />
                    <asp:ListView runat="server" ID="lvAlbEach" ItemPlaceholderID="items">
                        <LayoutTemplate>
                            <ul>
                                <asp:PlaceHolder runat="server" ID="items" />
                            </ul>
                        </LayoutTemplate>
                        <ItemTemplate>
                            <li>
                                <%# Eval( "Title") %></li>
                        </ItemTemplate>
                    </asp:ListView>
            </ItemTemplate>
        </asp:ListView>
    ça me génère une erreur dans le code-behind (aspx.cs) ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                    lvAlbEach.DataSource = albEach;
                    lvAlbEach.DataBind();
    The name 'lvAlbEach' does not exist in the current context

  15. #15
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 220
    Points : 268
    Points
    268
    Par défaut
    C'est normal, il te faut utiliser ceci en fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var listViewtmp = (ListView)e.Item.FindControl("lvAlbEach");
    listViewExperience.DataSource = albEachTable;
    listViewtmp.DataBind();
    Voir ici pour plus d'infos: http://social.msdn.microsoft.com/For...-03d1443977f2/

Discussions similaires

  1. Réponses: 7
    Dernier message: 22/06/2012, 12h12
  2. Réponses: 8
    Dernier message: 10/12/2009, 16h53
  3. [AJAX] liste liée a une liste liée a une liste
    Par dirty_harry dans le forum AJAX
    Réponses: 2
    Dernier message: 03/07/2009, 11h18
  4. Réponses: 2
    Dernier message: 01/05/2008, 13h36
  5. remplir une liste à partir d'une liste
    Par LeXo dans le forum Access
    Réponses: 7
    Dernier message: 14/04/2006, 12h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo