none
Afficher des données de maniére organisée et dynamique RRS feed

  • Question

  •  

    Bonjour,

    Voici ma problématique : je travaille sur une table qui représente la carte d'un restaurant. Chaque ligne représente un plat avec un Id, une description et une type (entrée, salade, plat, dessert, etc.). Les plats proposés ne sont pas les mêmes d'un jour sur l'autre, il y a donc une dernière colonne qui précisent quels sont les jours où le plat est présent. L'idée est d'afficher les plats disponible tel jour en fonction du choix du jour par l'utilisateur dans une liste déroulante.

    Le mise en place de la liste déroulante et la récupération du jour ne pose pas de problème. Ce qui en pose en revanche c'est l'affichage des résultats. Je rappelle que ma table a la forme suivante :

    id_plat; descr_plat;type_plat;jours_présents_plat

    Je voudrais afficher :

    1er Type du plat

    * plat 1

    * plat 2

    2nd Type de plat

    * plat 6

    * plat 8

    etc.

    Pour ce faire j'ai essayé deux méthodes avec lesquelles je n'arrive pas à conclure.

    La première vient de cette page : http://www.codeproject.com/KB/database/ConnectCsharpToMysql.aspx

    Mon problème est qu'au final, la liste est récupérée dans un DataGridView, composant auquel je n'ai pas accès dans le cadre de mon projet de site internet. J'ai essayé d'utiliser un GridView mais sans succès.

    Ensuite j'ai trouvé des articles mettant en place des Datalist dynamiques. Notamment celui-ci : http://www.codedigest.com/Articles/ASPNET/164_Creating_Dynamic_DataList_control_in_C_ASPNet.aspx

    J'ai un peu adapté le code pour correspondre à mes besoins, le voici :

     

    protected void Page_Load(object sender, EventArgs e)
        {
            string query = "SELECT dish_description, type_of_dish FROM cardapio ORDER BY type_of_dish";
            MySqlConnection connexion= new MySqlConnection(ConfigurationManager.ConnectionStrings["AEC_MYSQL"].ConnectionString);
            connexion.Open();
            MySqlCommand cmd = new MySqlCommand(query, connexion);
            
            MySqlDataAdapter mada = new MySqlDataAdapter(cmd);
            DataSet dsMenu = new DataSet();
            MySqlCommandBuilder mcb = new MySqlCommandBuilder(mada);
    
            mada.Fill(dsMenu,"cardapio");
    
            for (int i = 0; i < dsMenu.Tables.Count; i++)
            {
                if(dsMenu.Tables[i].Rows.Count > 0)
                {
                    string test = dsMenu.Tables[i].Rows[0]["type_of_dish"].ToString();
                    DataList dlMenu = ConstructDL(test, dsMenu.Tables[i].Rows.Count);
                    dlMenu.DataSource = dsMenu.Tables[i];
                    dlMenu.DataBind();
                    PlaceHolder1.Controls.Add(dlMenu);
                }
            }
        }
        public DataList ConstructDL(string CategoryName,int Count)
        {
            DataList dlMenu = new DataList();
            MyTemplate headTemplate = new MyTemplate(ListItemType.Header);
            headTemplate.CategoryName = CategoryName;
            dlMenu.HeaderTemplate = headTemplate;
            dlMenu.Width = Unit.Percentage(100);
            dlMenu.ItemTemplate = new MyTemplate(ListItemType.Item);
            MyTemplate footerTemplate = new MyTemplate(ListItemType.Footer);
            footerTemplate.NoOfArticles = Count.ToString();
            dlMenu.FooterTemplate = footerTemplate;
            return dlMenu;
        }
    }
    
    public class MyTemplate : ITemplate
    {
        ListItemType _itemType;
        private string _no;
        private string _categoryName;
    
    
        public string NoOfArticles
        {
            get
            {
                return _no;
            }
            set
            {
                _no = value;
            }
    
        }
        public string CategoryName
        {
            get
            {
                return _categoryName;
            }
            set
            {
                _categoryName = value;
            }
        }
        public MyTemplate(ListItemType Type)
        {
            _itemType = Type;
        }
        public void InstantiateIn(System.Web.UI.Control container)
        {
            Literal lc = new Literal();
            switch (_itemType)
            {
                case ListItemType.Header:
                    lc.Text = "<div><b>" + CategoryName + "</b></div>";
                    break;
                case ListItemType.Item:
                    lc.DataBinding += new EventHandler(TemplateControl_DataBinding);
                    break;
                case ListItemType.Footer:
                    lc.Text = "<div style=\"text-align:right\">" + NoOfArticles + " Plat(s) présent(s) dans ce type</div>";
                    break;
            }
            container.Controls.Add(lc);
        }
        private void TemplateControl_DataBinding(object sender, System.EventArgs e)
        {
            Literal lc;
            lc = (Literal)sender;
            DataListItem container = (DataListItem)lc.NamingContainer;
            lc.Text += "<div><div>" + DataBinder.Eval(container.DataItem, "dish_description") + "</div></div>";
        } 
    


    Mon problème est que ce code ne voit pas les différents type de plat, seulement le premier, ensuite il considère que tout le reste est sur le même type (étant donné mes difficultés, je n'ai pas encore introduit le filtrage par jour dans ce code).

    Sur le forum, je viens aussi de remarquer cette article http://social.msdn.microsoft.com/Forums/fr-FR/aspnetfr/thread/feab699c-a421-4b76-8f47-0ea77105e16b

     

    Je vous ai donné ma problématique et les différentes pistes que j'ai suivi sans malheureusement trop de succès.

    J'aimerai avoir de l'aide soit pour corriger mon code actuel pour qu'il corresponde à mon besoin, soit peut-être une nouvelle piste ou une nouvelle manière de voir le problème pour trouver une solution (peut-être mettre en place une table supplémentaire avec les types de plat...).

    Merci de prendre le temps de lire mon post et merci d'avance pour vos réponses.

     


    Nicolas Merle Utilisateur ASP.NET débutant
    jeudi 29 décembre 2011 13:47

Toutes les réponses

  • Bonjour,

     

    Je ne comprends pas très bien votre code. Par exemple, quel est le but de la ligne

     

    for (int i = 0; i < dsMenu.Tables.Count; i++)

     

    dans Page_Load. Votre DataSet contient une seule table donc la boucle n’est pas nécessaire et vous pouvez référencer la table par :

     

    DataTable table = dsMenu.Tables[0];

     

    Puis, je vois que votre DataList reçoit comme paramètre le type du premier plat et le nombre d’éléments est le nombre d’éléments de votre table :

     

    DataList dlMenu = ConstructDL(test, dsMenu.Tables[i].Rows.Count)

     

    donc le comportement de votre application est normal.

     

    Il faut plutôt déterminer à partir de votre DataTable la liste des plats pour chaque type et puis les afficher. Vous essayez faire tout d’une manière automatique, seule par indiquer la source de données et sans modifier le format de votre data.

     

    Cordialement,

     

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    • Marqué comme réponse Ciprian Duduiala jeudi 5 janvier 2012 06:54
    • Non marqué comme réponse Philomelo jeudi 5 janvier 2012 12:35
    mardi 3 janvier 2012 14:53
  • Bonjour,

    En ce qui concerne la boucle initiale, je suis arrivé à la même conclusion, mais étant débutant en C#, je n'avais pas encore pris le temps de simplifier le code.

    En ce qui concerne la DataTable, est-ce que vous auriez des pistes pour réaliser la liste des plats de chaque type et les afficher ?

    Merci d'avance,

    Nicolas


    Nicolas Merle Utilisateur ASP.NET débutant
    jeudi 5 janvier 2012 12:47
  • Le mise en place de la liste déroulante et la récupération du jour ne pose pas de problème. Ce qui en pose en revanche c'est l'affichage des résultats.

    Voulez-vous afficher une liste déroulante contenant la liste des jours disponibles, puis quand l'utilisateur final choisi le jour, les résultats s'affichent ou voulez-vous afficher dynamiquement les résultats en fonction du jour présent (DateTime.Now) ?


    aelassas.free.fr
    dimanche 8 janvier 2012 11:57
    Auteur de réponse
  • Il s'agit bien du premier cas.

    L'utilisateur choisit un jour dans la liste déroulante, et le site affiche la liste des plats proposé le jour choisit.


    Nicolas Merle Utilisateur ASP.NET débutant
    lundi 9 janvier 2012 17:07
  • Il s'agit bien du premier cas.

    Dans ce cas, Vous pouvez soit activer l'AutoPostBack de votre contrôle DropDownList contenant la liste des jours disponibles en affectant la propriété AutoPostBack à true puis utilisez l'événement SelectedIndexChanged dans lequel vous mettrez la logique pour remplir votre DataList.

    Soit ajouter un bouton dans la page puis quand l'utilisateur final clique dessus, vous remplissez la DataList dans l'événement OnClick (la propriété AutoPostBack de votre contrôle DropDownList doit être à false dans ce cas car vous n'avez pas besoin de déclenchez un PostBack à chaque sélection d'un jour différent).

    Libre à vous de choisir la solution qui vous convient le mieux.


    aelassas.free.fr
    lundi 9 janvier 2012 17:33
    Auteur de réponse