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 :

[ASP.NET/C#] Croiser deux listes dans un tableau


Sujet :

ASP.NET

  1. #1
    Membre confirmé Avatar de Vinceee38
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 134
    Par défaut [ASP.NET/C#] Croiser deux listes dans un tableau
    Bonjour tout le monde,

    J'ai une base de données qui contient 3 tables :

    Ressource(re_id, re_libelle)
    Offre(off_id, off_libelle)
    Prix(prix_id, re_id, off_id, prix)

    Je vous ai marqué entre parenthèse les clés pour que vous compreniez le lien entre ses tables.

    Voila le soucis que j'ai :

    Je récupère mes ressources dans une liste.
    Je récupère mes offres dans une autre liste.

    Je cherche à faire un tableau croisé en asp.net qui ressemblerait à ca :


    Est ce que je dois parcourir tous les éléments de la liste des ressources et pour chaque élément parcourir à chaque fois la liste des offres en vérifiant s'il y a un prix qui correspond aux deux ?

    Comment est ce que je peux procéder pour que ce soit le plus performant ?

    J'ai vraiment du mal à voir comment je peux faire ca. Ca doit être tout bête mais je pense qu'en fin de soirée mon cerveau doit lutter lol...

    Merci d'avance à ceux qui essayeront de m'aider.

  2. #2
    Membre confirmé Avatar de Vinceee38
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 134
    Par défaut
    Bon bah j'ai fini par trouver une solution tout seul, j'ai développé une fonction qui permet d'intervertir un tableau en utilisant le resutat de requete en bdd, je donne la fonction si jamais ca peut servir :

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
            private DataTable GetInversedDataTable(DataTable table)
            {
                /*
                 * ColumnX = C'est la colonne du haut (Les offres)
                 * ColumnY = C'est la colonne de gauche (Les ressources)
                 * ColumnZ = C'est la valeur qui se trouve au croisement de l'offre et la ressource (Les prix)
                 */
     
                //Create a DataTable to Return
                DataTable returnTable = new DataTable();
     
                //On ajoute la colonne des offres directement au début
                returnTable.Columns.Add("re_libelle");
     
                List<string> listOffres = new List<string>();
     
                foreach (DataRow dr in table.Rows)
                {
                    //Pour chaque ligne de resultat de la requete stockées dans table
                    //On récupère la valeur qui est stockée dans la columnX soit off_id
                    string NomOffre = dr["off_libelle"].ToString();
                    if (!listOffres.Contains(NomOffre))
                    {
                        if (!string.IsNullOrEmpty(NomOffre))
                        {
                            //Pour chaque valeur trouvée qui n'existe pas déjà dans la liste on l'ajoute
                            listOffres.Add(NomOffre);
                            //On ajoute à la table la colonne (par exemple, offre 1 : Billet 1 jour)
                            returnTable.Columns.Add(NomOffre);
                        }
                    }
                }
     
                List<string> listRessources = new List<string>();
     
                foreach (DataRow dr in table.Rows)
                {
                    string NomRessource = dr["re_libelle"].ToString();
                    //On parcours toutes les valeurs des ressources maintenant
                    if (!listRessources.Contains(NomRessource))
                    {
                        if (!string.IsNullOrEmpty(NomRessource))
                        {
                            //Pour chaque ressource qui n'existe pas encore dans la liste des ressources on la stocke
                            listRessources.Add(NomRessource);
                        }
                    }
                }
     
                //Ensuite pour chaque valeur stockée dans la liste des ressources
                foreach (string NomRessource in listRessources)
                {
                    //On créer une nouvelle ligne
                    DataRow drReturn = returnTable.NewRow();
                    drReturn[0] = NomRessource; // On assigne le nom de la ressource à la premiere colonne
     
                    //ColumnY = champ ressource (re_libelle)
                    //columnYValue = valeur contenu dans le champ ressource
                    //On filtre en gardant que les lignes qui contienne la valeur de la ressource en cours
                    DataRow[] rows = table.Select(("re_libelle" + "='") + NomRessource + "'"); // revient à faire un where re_libelle ='Adulte'
     
                    //Pour chaque ligne qui concerne cette ressource
                    foreach (DataRow dr in rows)
                    {
                        //On stocke champ qui concerne l'offre (Billet 1 jour)
                        string rowColumnTitle = dr["off_libelle"].ToString();
     
                        //int i = 0;
                        foreach (DataColumn dc in returnTable.Columns)
                        {
                            //if (dc.ColumnName != "re_libelle")
                            //{
                                //Pour chaque colonne du tableau
                                //Si le nom de la colonne est identique au nom 
                                if (dc.ColumnName == rowColumnTitle)
                                {
                                    drReturn[rowColumnTitle] = "<a href='ChangePrice.aspx?off_id=" + dr["off_id"] + "&re_id = " + dr["re_id"] + "'>" + dr["price"] + "</a>";
                                    //drReturn[rowColumnTitle] = dr["off_id"];
                                    //PriceOffer offer = new PriceOffer(Convert.ToInt32(dr["off_id"]));
                                    //PriceRessource ressource = new PriceRessource(Convert.ToInt32(dr["re_id"]));
                                    //Price price = new Price(ressource, offer, dr["price"].ToString(), Convert.ToDateTime(dr["date_deb"]), Convert.ToDateTime(dr["date_fin"]), new Prestation(Convert.ToInt32(dr["pre_id"])));
                                    //drReturn[rowColumnTitle] = price;
                                }
                            //    else
                            //    {
                            //        drReturn[i] = "<a href='addPrice.aspx?off_id=" + dr["off_id"] + "&re_id = " + dr["re_id"] + "'>Add price</a>";
                            //    }
                            //}
                            //i++;
                        }
                    }
                    returnTable.Rows.Add(drReturn);
                }
     
                foreach (DataRow dr in returnTable.Rows)
                {
                    foreach (DataColumn dc in returnTable.Columns)
                    {
                        if (string.IsNullOrEmpty(dr[dc.ColumnName].ToString()))
                        {
                            dr[dc.ColumnName] = "<a href='AddPrice.aspx?off_libelle=" + dr.ItemArray[0].ToString().ToLower() + "&re_libelle=" + dc.ColumnName.ToString().ToLower() + "'>Add price</a>";
                            //dr[dc.ColumnName] = "<asp:Button ID='test' runat='server' Text='test' />";
                        }
                    }
                }
     
                return returnTable;
            }
    J'ai pas eu le temps de supprimer mes commentaires !

    Et en gros ca se charge comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                    DataTable dt = new DataTable();
                    DataTable dt2 = new DataTable();
                    dt.Load(Reader);
                    dt2 = GetInversedDataTable(dt);
    Je passe en résolu.

    Bonne soirée à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 06/08/2007, 01h37
  2. Réponses: 1
    Dernier message: 02/08/2007, 16h17
  3. ecrire deux listes dans un select
    Par rherrad dans le forum Struts 1
    Réponses: 35
    Dernier message: 26/07/2007, 15h18
  4. Réponses: 6
    Dernier message: 09/07/2007, 17h02
  5. [SQL 2005][ASP.net 2]Insertion de date dans une table
    Par skystef dans le forum Accès aux données
    Réponses: 2
    Dernier message: 29/12/2006, 09h26

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