none
Remplir un tableau depuis la base de Données et afficher les résultats filtrés dans une gridView. RRS feed

  • Question


  • Bonjour à tous,

    Je dois charger un tableau depuis la Base de Données pour effectuer un tri selon mes critères définis. Ensuite afficher les Données filtrées, si elles existent ou pas, dans ma GridView (nommée gdvAgents)  depuis ma BD. Mon Application est de type 3 tiers. L' IU WebForm, la BLL (AgentBLL dans mon cas) et la DAL (AgentDAL dans mon cas).

    Voici ma procédure de recherche:

     public static Agent [] RechercherAgent(Agent[] agents, string aMatriculeAgent, string aNomAgent, string aNumTelephone,string aEquipe, int aGrade,int aNiveauLangue)
            {
                IEnumerable<Agent>AgentFiltrés;
    
                AgentFiltrés = agents;
                
    
                if(aMatriculeAgent !=null)
                {
                    AgentFiltrés.Where(a=>a.AgentMatricule ==aMatriculeAgent);
                }
    
                if (aNomAgent != null)
                {
                    AgentFiltrés.Where(a => a.Nom == aNomAgent);
                }
    
                if (aNumTelephone != null)
                {
                    AgentFiltrés.Where(a => a.TelephoneAgent == aNumTelephone);
                }
    
                if (aEquipe != null)
                {
                    AgentFiltrés.Where(a => a.AgentEquipe == aEquipe);
                }
    
                if (aNiveauLangue != null)
                {
                    AgentFiltrés.Where(a => a.NiveauAnglais == aNiveauLangue);
                }
    
    
                return AgentFiltrés.ToArray();
    
    
            }
    

    Comment pourrais-je intégrer une source au tableau Agent [] depuis la BD et ensuite afficher le résultat dans ma gridview?

    Cordiallement.

    samedi 24 mai 2014 15:24

Réponses

  • Bonjour, 

    La première ligne de votre méthode BtRechercher_Click est inutile, vous n'affecté aucune varialbe au retourn de l'appel RechercherAgent.

     protected void BtRechercher_Click(object sender, EventArgs e)
            {
               
                            RechercherAgent(txtMatricule.Text.Trim(),txtNomAgent.Text.Trim(),txtNumeroTelephone.Text.Trim(),(DDL_Equipe.SelectedValue),Convert.ToInt32(DDL_Grade.SelectedValue),Convert.ToInt32(DDL_Langue.SelectedValue));
    

    Dans la méthode RechercherAgent, les tests ne sont pas optimales. Utilisez String.IsNullOrWhiteSpace pour vérifier la nullité de votre paramètre.

    Vous pouvez remplacer les tests sur les variable de type string comme suit : 

                if(!String.IsNullOrWhiteSpace(aMatriculeAgent))
                {
                   AgentFiltrés = AgentFiltrés.Where(a=>a.AgentMatricule.Contains(aMatriculeAgent));
                }

    Enfin, comme l'a précisé Aurel, le test sur la valeure de la DropDown est peut-être incorrect.

    Enfin, vous pouvez utiliser le mode pas à pas du débugger afin de vérifier le comportement de la méthode RechercheAgent...

    Cordialement, 


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    mardi 27 mai 2014 08:15

Toutes les réponses

  • Bonjour,

    Vu que vous utilisez des objets et non un DataTable, je vous conseil d'utiliser la class BindingSource en tant que source de données de votre GridView.

    Dans ce bindingSource vous pourrez inclure l'ensemble des objets sur lesquels la grille doit se binder.

    Après avoir  spécifié la source de données dans la Grille, vous pourrez modifier les colonnes aisément.

    Vous pouvez procéder comme suit :

    var source = new BindingSource();

    foreach(var item in RechercherAgent(...))

    source.Add(item);

    dataGrid.DataSource = source;

    dataGird.Columns....

    Cordialement,


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    samedi 24 mai 2014 15:45
  • Bonjour,

    Intéressant comme proposition. Mais le préalable, est de charger les données depuis la Base et/ou les affectées à la procédure RechercherAgent(...). Maintenant la question, comment affecter les paramètres à cette procédure. Je n'arrive pas à affecter le tableau Agent [] Agents à cette procédure. Les autres paramètres ça va. Excusez moi, je n'ai pas l'habitude de manipuler les tableaux.

    Cordialement.

    samedi 24 mai 2014 16:03
  • Bonjour,

    Pour vous, que contiens le paramètre agents de la méthode RechercheAgent ?

    Si je comprends bien, ce paramètre contiendrait tous les agents disponibles en base de données ?

    Si c'est le cas alors vous travaillez en LinQ To Object  donc aucune procédure à appeler.

    Cordialement,


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    samedi 24 mai 2014 16:10
  • Merci pour la réponse. Maintenant je voudrais appeler la procédure RechercherAgent. Elle contient 7 paramètres dont le Tableau en 1er lieu, voici la capture de ma tentative d'appel de la procédure. Je n'arrive pas à y insérer le paramètre tableau Agents.

    Appel de la procédure de recherche

    Merci de m'aider.

    samedi 24 mai 2014 16:28
  • Bonjour,

    C'est votre constructeur qui n'est pas correct.

    Vous devez utiliser un constructeur de tableau et non le constructeur d'instance :

    Agent[] Ag = new Agent[0]();

    Ceci crééra un tableau vide.

    Cordialement,


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    samedi 24 mai 2014 16:39
  • Impossible de créer une instance de tableau vide avec ceci: Agent Ag = new Agent [0] ();

    Voir image:

    Cordialement.

    samedi 24 mai 2014 17:07
  • Pardon,

    J'ai fais une petite erreur :

    Agent[] Ag = new Agent[0];

    Cordialement,


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    samedi 24 mai 2014 17:16
  • J'ai un petit problème au niveau d'une DropDownList, je finis de le régler et vous fais un retour.

    Cordialement.

    samedi 24 mai 2014 18:30
  • A l’exécution, il est est impossible de lire dans la boucle foreach.

                foreach (var oAgent in RechercherAgent(Ag, txtMatricule.Text.Trim(), txtNomAgent.Text.Trim(), txtNumeroTelephone.Text.Trim(), (DDL_Equipe.SelectedValue), Convert.ToInt32(DDL_Grade.SelectedValue), Convert.ToInt32(DDL_Langue.SelectedValue)))
                {
                    
                    source.Add(oAgent);
                }

    Je crois que c'est parce qu'il n'y aucune données dans le tableau.

    samedi 24 mai 2014 19:30
  • Effectivement,

    Si aucune données n'est présente dans votre tableau d'origine, aucune donnée ne sera présente dans le retour de votre méthode.

    Cordialement,


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    samedi 24 mai 2014 19:51
  • Justement, c'est pour quoi, j'ai interrogé sur cet dans ma 1ere réponse:

    "Mais le préalable, est de charger les données depuis la Base et/ou les affectées à la procédure RechercherAgent(...). Maintenant la question, comment affecter les paramètres à cette procédure."

    Et vous m'avez repondu qu'avec LINQ to Object, la question ne se posait pas. Or sans chargement de données, rien n'est possible. Donc, je vais chercher comment charger le tableaux avant le tri.

    Cordialement.

    samedi 24 mai 2014 22:10
  • Désolé.

    OK pour le chargement des données

    Comment souhaitiez vous les charger ? Quelle-est votre base de données ?

    Utilisez-vous un ORM ? (EntityFramework, NHibernate, ...)

    Cordialement,


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    dimanche 25 mai 2014 07:59
  • Bonjour,

    J'utilise Entity Framework et une Base de Données SQL (instance 2008)

    Cordialement.

    dimanche 25 mai 2014 17:01
  • Bonjour,

    Avez vous réussi a le configurer?

    Si oui, en théorie, vous pourriez donc supprimé le paramètre agents de la méthode RechercheAgent

    Du coup dans cette méthode, vous aurez à effectuer quelquechose dans ce genre :

    using (var context = new DataContext()){

     var query = context.Agents();

    if(...)

    {

    query = query.Where(...);

    }

    return query.ToArray();

    }

    Cordialement,


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    dimanche 25 mai 2014 18:23
  • Bonjour,

    J'ai pu configurer la méthode comme indiquée, mais toujours est-il que le filtrage n'est pas effectué.

    La méthode me ramène la liste de tous les agents disponible.

    Voici le code de la méthode:

    public static Agent [] RechercherAgent( string aMatriculeAgent, string aNomAgent, string aNumTelephone,string aEquipe, int aGrade,int aNiveauLangue)
            {
                IEnumerable<Agent>AgentFiltrés;
    
              
    
    
                AgentFiltrés = ContexteDAO.ContexteDonnees.Agents.ToList();
    
                if(aMatriculeAgent !=null)
                {
                    AgentFiltrés.Where(a=>a.AgentMatricule.Contains(aMatriculeAgent));
                }
    
                if (aNomAgent != null)
                {
                    AgentFiltrés.Where(a => a.Nom.Contains(aNomAgent));
                }
    
                if (aNumTelephone != null)
                {
                    AgentFiltrés.Where(a => a.TelephoneAgent.Contains(aNumTelephone));
                }
    
                if (aEquipe != null)
                {
                    AgentFiltrés.Where(a => a.AgentEquipe.Contains(aEquipe));
                }
    
                if (aNiveauLangue != null)
                {
                    AgentFiltrés.Where(a => a.NiveauAnglais.Equals(aNiveauLangue));
                }
    
    
                return AgentFiltrés.ToArray();
    
    
            }
    
    Cordialement.

    lundi 26 mai 2014 15:36
  • Bonjour,

    Vous n'avez pas tout a fait fait comme je le disais.

    De préférence, faite l'appel à la méthode ToArray(ToList, To...) à la fin uniquement de votre méthode. Cela permet à EntityFramework de transposer la requête linq en Requête SQL. De cette façon seuls les entités filtrés seront remontées à l'application (gains de performances).

    Ensuite, il faut toujours récupérer la requête linq à chaque filtrage comme suit :

    if(...)

    {

    query = query.Where(...);

    }

    Dans votre cas, vous devriez faire comme ceci :

      public static Agent [] RechercherAgent( string aMatriculeAgent, string aNomAgent, string aNumTelephone,string aEquipe, int aGrade,int aNiveauLangue)
            {
                var AgentFiltrés = ContexteDAO.ContexteDonnees.Agents;

                if(aMatriculeAgent !=null)
                {
                    AgentFiltrés = AgentFiltrés.Where(a=>a.AgentMatricule.Contains(aMatriculeAgent));
                }

                if (aNomAgent != null)
                {
                    AgentFiltrés = AgentFiltrés.Where(a => a.Nom.Contains(aNomAgent));
                }

                if (aNumTelephone != null)
                {
                    AgentFiltrés = AgentFiltrés.Where(a => a.TelephoneAgent.Contains(aNumTelephone));
                }

                if (aEquipe != null)
                {
                    AgentFiltrés = AgentFiltrés.Where(a => a.AgentEquipe.Contains(aEquipe));
                }

                if (aNiveauLangue != null)
                {
                    AgentFiltrés = AgentFiltrés.Where(a => a.NiveauAnglais.Equals(aNiveauLangue));
                }

                return AgentFiltrés.ToArray();
            }

    Cordialement,


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    lundi 26 mai 2014 17:14
  • Voici le code modifié:

        public static Agent [] RechercherAgent( string aMatriculeAgent, string aNomAgent, string aNumTelephone,string aEquipe, int aGrade,int aNiveauLangue)
            {
                IEnumerable<Agent>AgentFiltrés;
    
                AgentFiltrés = ContexteDAO.ContexteDonnees.Agents;
    
             
                
    
                if(aMatriculeAgent !=null)
                {
                    AgentFiltrés.Where(a=>a.AgentMatricule.Contains(aMatriculeAgent));
                }
    
                if (aNomAgent != null)
                {
                    AgentFiltrés.Where(a => a.Nom.Contains(aNomAgent));
                }
    
                if (aNumTelephone != null)
                {
                    AgentFiltrés.Where(a => a.TelephoneAgent.Contains(aNumTelephone));
                }
    
                if (aEquipe != null)
                {
                    AgentFiltrés.Where(a => a.AgentEquipe.Contains(aEquipe));
                }
    
                if (aNiveauLangue != null)
                {
                    AgentFiltrés.Where(a => a.NiveauAnglais.Equals(aNiveauLangue));
                }
    
    
                return AgentFiltrés.ToArray();
    
    
            }
    

    Le résultat reste toujours le même.

    Cordialement.

    lundi 26 mai 2014 18:12
  • Vous n'avez pas implémenté comme je vous l'avais dit.

    Dans chaque corps des tests vous devez réaffecter le AgentFiltrés :

    AgentFiltrés = AgentFiltrés.Where(a=>a.AgentMatricule.Contains(aMatriculeAgent));

    Cordialement,


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    lundi 26 mai 2014 18:40

  • Voici le code modifié:

            public static Agent [] RechercherAgent(string aMatriculeAgent, string aNomAgent, string aNumTelephone,string aEquipe, int aGrade,int aNiveauLangue)
            {
                IEnumerable<Agent>AgentFiltrés;
    
                AgentFiltrés = ContexteDAO.ContexteDonnees.Agents;
    
             
                
    
                if(aMatriculeAgent !=null)
                {
                   AgentFiltrés = AgentFiltrés.Where(a=>a.AgentMatricule.Contains(aMatriculeAgent));
                }
    
                if (aNomAgent != null)
                {
                    AgentFiltrés = AgentFiltrés.Where(a => a.Nom.Contains(aNomAgent));
                }
    
                if (aNumTelephone != null)
                {
                    AgentFiltrés = AgentFiltrés.Where(a => a.TelephoneAgent.Contains(aNumTelephone));
                }
    
                if (aEquipe != null)
                {
                    AgentFiltrés = AgentFiltrés.Where(a => a.AgentEquipe.Contains(aEquipe));
                }
    
                if (aNiveauLangue != 0)
                {
                    AgentFiltrés = AgentFiltrés.Where(a => a.NiveauAnglais.Equals(aNiveauLangue));
                }
    
    
                return AgentFiltrés.ToArray();
    
    
            }
    

    A l’exécution, le résultat reste inchangé.

    A l’exécution pas à pas (F10 et F11), la recherche n'entre pas dans la boucle foreach du code suivant:

     protected void BtRechercher_Click(object sender, EventArgs e)
            {
               
                            RechercherAgent(txtMatricule.Text.Trim(),txtNomAgent.Text.Trim(),txtNumeroTelephone.Text.Trim(),(DDL_Equipe.SelectedValue),Convert.ToInt32(DDL_Grade.SelectedValue),Convert.ToInt32(DDL_Langue.SelectedValue));
    
                var source = new BindingSource();
                
    
                foreach (var oAgent in RechercherAgent( txtMatricule.Text.Trim(), txtNomAgent.Text.Trim(), txtNumeroTelephone.Text.Trim(), (DDL_Equipe.SelectedValue), Convert.ToInt32(DDL_Grade.SelectedValue), Convert.ToInt32(DDL_Langue.SelectedValue)))
                {
                    
                    source.Add(oAgent);
                }
    
                gdvAgents.DataSource = source;
                gdvAgents.DataBind();
    
           }

    Ce qui veut dire que le tableau de recherche n'a pu être chargé. Voici la requête SQL exécutée dans ma Base fournit une réponse nette:

    Et voici mon interface affichant le résultat:

    Je compte essayer une autre méthode.

    Merci.

    Cordialement.


    lundi 26 mai 2014 23:33
  • Bonjour,

    Si vous voulez comprendre pourquoi la liste n'est pas correctement chargée, alors lancez SQL profiler pour regarder la requête SQL qui est envoyée.

    Celle-ci vous indiquera quel filtre pose problème.

    Cette Solution me semble correcte a ceci près :

    La première ligne de votre méthode BtRechercher_Click est inutile, vous n'affecté aucune varialbe au retourn de l'appel RechercherAgent.

    Dans la méthode RechercherAgent, les tests ne sont pas optimales. Utilisez String.IsNullOrWhiteSpace pour vérifier la nullité de votre paramètre.

    Cordialement,


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    mardi 27 mai 2014 06:24
  • Bonjour,

    Je ne saisi pas :

    Cette Solution me semble correcte a ceci près :

    La première ligne de votre méthode BtRechercher_Click est inutile, vous n'affecté aucune varialbe au retourn de l'appel RechercherAgent.

    Dans la méthode RechercherAgent, les tests ne sont pas optimales. Utilisez String.IsNullOrWhiteSpace pour vérifier la nullité de votre paramètre.



    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    Voici la 1ere ligne de la méthode:

     IEnumerable<Agent>AgentFiltrés;

    Lorsque je l'enlève, la méthode devient inutilisable.

    Je sais où je dois mettre String.IsNullOrWhiteSpace dans cette méthode.

    Cordialement.

    mardi 27 mai 2014 07:45
  • Bonjour

    Il y a une chance de ne pas envoyer les bons paramètres pour un des DropDown.
    Si rien n'est selecte, la valeur SelectedIndex = -1.
    Essayez de mettre en dur tous les paramètres de RechercherAgent, verifies le resultat et commencez à remplacer les valeurs en dur avec des valeurs saisis dans les textbox/DropDown un par un.  Vérifiez le résultat après chaque remplacement pour identifier exactement le problème.

    Bien cordialement,
       

    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mardi 27 mai 2014 07:48
  • Bonjour, 

    La première ligne de votre méthode BtRechercher_Click est inutile, vous n'affecté aucune varialbe au retourn de l'appel RechercherAgent.

     protected void BtRechercher_Click(object sender, EventArgs e)
            {
               
                            RechercherAgent(txtMatricule.Text.Trim(),txtNomAgent.Text.Trim(),txtNumeroTelephone.Text.Trim(),(DDL_Equipe.SelectedValue),Convert.ToInt32(DDL_Grade.SelectedValue),Convert.ToInt32(DDL_Langue.SelectedValue));
    

    Dans la méthode RechercherAgent, les tests ne sont pas optimales. Utilisez String.IsNullOrWhiteSpace pour vérifier la nullité de votre paramètre.

    Vous pouvez remplacer les tests sur les variable de type string comme suit : 

                if(!String.IsNullOrWhiteSpace(aMatriculeAgent))
                {
                   AgentFiltrés = AgentFiltrés.Where(a=>a.AgentMatricule.Contains(aMatriculeAgent));
                }

    Enfin, comme l'a précisé Aurel, le test sur la valeure de la DropDown est peut-être incorrect.

    Enfin, vous pouvez utiliser le mode pas à pas du débugger afin de vérifier le comportement de la méthode RechercheAgent...

    Cordialement, 


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    mardi 27 mai 2014 08:15
  • Au fait, j'avais omis 2 détails très importants:

    1 C# est sensible à la casse.

    2- !string.IsNullOrEmpty different de != Null. Voir image:

    Avec !=Null, la condition est vérifiée dans la réalité, alors ce n'est pas le cas dans la logique.

    Merci à vous, c'est très sympa.

    mardi 27 mai 2014 09:45