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

Windows Forms Discussion :

C# / Windowsform / Filtrer un Datagridview depuis plusieurs listbox


Sujet :

Windows Forms

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Octobre 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2020
    Messages : 9
    Points : 7
    Points
    7
    Par défaut C# / Windowsform / Filtrer un Datagridview depuis plusieurs listbox
    Bonjour,

    J'ai un WindowsForm dans lequel il y a plusieurs listbox et un dataGridView. J'ai relié mon DataGridView avec une table SQL dans laquelle je souhaite filtrer avec mes listboxes.
    J'arrive à filtrer avec mes listbox mais chacune fait son filtre. J'ai besoin de combiner les filtres de mes listbox ex: Mon datagriview représente une table d'actions d'entreprises.
    J'ai une listbox "devise" avec des devises telles que "USD", "EUR","CHF" etc... et une listbox "secteurs" tels que "Technologie", "Automobile","Media" etc...
    L'objectif est de filtrer par exemple en affichant les actions dont la devise est "EUR" ET le secteur "Automobile".

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // Remplis mon dataGridViewActions avec les devises et les secteurs de toutes les actions
     
        public void defaultview()
                {
                    string connetionString = @"Data Source=mon_serveur;Initial Catalog=ma_base_de_données;Integrated Security=SSPI";
                    SqlConnection cnn = new SqlConnection(connetionString);
                    SqlDataAdapter sqlDA = new SqlDataAdapter("SELECT Devises, Secteurs FROM Actions", cnn);
                    System.Data.DataTable Dt = new System.Data.DataTable();
                    sqlDA.Fill(Dt);
                    dataGridViewActions.DataSource = Dt;
                }
    Exemple d'une listbox qui filtre de manière seule (non simultanée avec un autre filtre):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        private void Devises_listBox_SelectedIndexChanged(object sender, EventArgs e)
                {
                    string connetionString = @"Data Source=mon_serveur;Initial Catalog=ma_base_de_données;Integrated Security=SSPI";
                    SqlConnection cnn = new SqlConnection(connetionString);
                    SqlDataAdapter sqlDA = new SqlDataAdapter("SELECT Devises, Secteurs FROM Actions", cnn);
                    System.Data.DataTable Dt = new System.Data.DataTable();
                    sqlDA.Fill(Dt);
                    DataView dv = Dt.DefaultView;
                    dv.RowFilter = "Devises LIKE '" + Devises_listBox.Text + "'";
                    dataGridViewFund.DataSource = dv;
                }
    ce que j'ai tenté ... qui compile mais ne renvoi rien dans le datagridview:

    J'ai créé une variable string vide dans ma classe partielle Form:

    ensuite lorsque je click sur un item d'une listbox (ici la listbox "secteurs"), c'est censé faire un appel à la fonction "rowfilterer" qui va récupérer un string que je le lui passe qui doit s'ajouter à ma variable "varfilter":

    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
       void Secteurs_listBox_SelectedIndexChanged(object sender, EventArgs e)
                {
                    rowfilterer("Secteurs LIKE '" + Secteurs.Text + "'");
                }
     
        void rowfilterer(string newfilter)
                {
     
                    string connetionString = @"Data Source=mon_serveur;Initial Catalog=ma_base_de_données;Integrated Security=SSPI";
                    SqlConnection cnn = new SqlConnection(connetionString);
                    SqlDataAdapter sqlDA = new SqlDataAdapter("SELECT Devises, Secteurs FROM Actions", cnn);
                    System.Data.DataTable Dt = new System.Data.DataTable();
                    sqlDA.Fill(Dt);
                    DataView dv = Dt.DefaultView;
                    if (varfilter.Length > 1)
                    {
                        varfilter = varfilter += $"And {newfilter}";
                        dv.RowFilter = varfilter;
                    }
                    else
                    {
                        varfilter = $"{newfilter}";
                        dv.RowFilter = varfilter;
                    }
     
                    dataGridViewFund.DataSource = dv;
                }
    De cette façon je me suis dit que les strings de filtre pourraient s'ajouter et donc compléter le string qui va servir de requête à la base SQL.
    Mais bon... pour l'instant ca va nulle part.

    Quelqu'un a une idée ?
    Merci d'avance pour votre aide

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Octobre 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2020
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    En cherchant un peu et en prenant exemple sur un projet en vba, je vais donc chercher à itérer ou "looper" pour les anglophones dans mes controls et lorsque mes controls sont de type "Listbox" j'ai besoin de récupérer les items sélectionnés pour chacune de mes listboxes. J'ajouterai ensuite chaque item selectionné dans chaque Listbox à mon string SQL qui me servira de requête (strSQL). Petit problème, l'objet "ctrl" ci-dessous, de type Control est capable de reconnaitre une listbox à l'aide de la méthode GetType mais ne récupère pas les méthodes de la classe Listbox qui permettent notamment d'identifier les items sélectionnés d'une listbox... quelqu'un aurait une idée dans ce cas de figure ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        private void ProcessControls(Control ctrlContainer)
                {
                    foreach (Control ctrl in ctrlContainer.Controls)
                    {
                        if (ctrl.GetType() == typeof(ListBox) && ctrl.Name.Contains("Fund") == true)
                        {
                        // Do whatever to the ListBox
     
                        }
     
                        if (ctrl.HasChildren)
                            ProcessControls(ctrl);
                    }
                }

  3. #3
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    foreach (Control ctrl in ctrlContainer.Controls)
    {
        // le as renvoie null si ctrl n'est pas du bon type
        ListBox current = ctrl as ListBox;
        if ((current != null) && (current.Name.Contains("Fund")))
        {
        }
    }

  4. #4
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    voici une méthode pour récupérer chaque item sélectionné dans chaque listbox (3 sur le form d'exemple):

    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
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
     
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            private List<string> items = null;
            private string varfilter = null;
            public Form1()
            {
                InitializeComponent();
            }
            private void Form1_Load(object sender, EventArgs e)
            {
                this.listBox1.Items.AddRange(new string[] { "Ali", "Moha", "Rachid" });
                this.listBox2.Items.AddRange(new string[] { "Paul", "Antoine", "Roland" });
                this.listBox3.Items.AddRange(new string[] { "Smith", "Jonathan", "Murphy" });
            }
            private void button1_Click(object sender, EventArgs e)
            {
                items = new List<string>();
                GetSelectedItems();
                varfilter += "Devises LIKE '" + items[0] + "'";
                varfilter += " AND Secteurs LIKE '" + items[1] + "'";
                varfilter += " AND Noms LIKE '" + items[1] + "'";
                MessageBox.Show(varfilter);
            }
            private void GetSelectedItems()
            {
                ProcessControls(this);
            }
            private void ProcessControls(Control ctrlContainer)
            {
                foreach (Control ctrl in ctrlContainer.Controls)
                {
                    if (ctrl.GetType() == typeof(ListBox) )
                    {
                        // Do whatever to the ListBox
                        ListBox lb = ctrl as ListBox;
                        string item = lb.SelectedItem as string;
                        items.Add(item);
                    }
     
                    if (ctrl.HasChildren)
                        ProcessControls(ctrl);
                }
            }
     
     
     
     
        }
    }
    bon code...

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Octobre 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2020
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Merci à vous deux pour vos idées ! Je vais essayer ce qui fonctionne le mieux dans ma situation et je vous partagerai ce que j'ai fait !

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Octobre 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2020
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Donc suite à vos propositions je me suis inspiré un peu des deux et voici mon code, je ne suis plus très loin. Il me manque cependant un détail : lorsque ma boucle passe sur la variable locale item, elle reconnait bien l'item de la ListBox sélectionné mais ensuite ma variable strCondition ne va pas l'ajouter... si il voit null Il va simplement ajouter la virgule "," de strCondition += $"{item}," ou m'afficher "Currency IN ('System.Data.DataRowView')" si il détecte un item sélectionné...

    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
    foreach (Control ctrl in ctrlContainer.Controls)
                {
                    strCondition = null;
                    ListBox lb = ctrl as ListBox;
                    if ((lb != null) && (lb.Name.Contains("Funds")))
                    {
                        string item = lb.SelectedItem as string;
                        strCondition += $"{item},";
     
                        if (strCondition.Length > 1)
                        {
                            if (strWhere == null)
                            {
                                strCondition = strCondition.TrimEnd(',');
                                strWhere += $"{ctrl.Name.Substring(14)} IN ('{strCondition}')";
                            }
                            else if (strWhere != null)
                            {
                                strCondition = strCondition.TrimEnd(',');
                                strWhere +=  $" AND {ctrl.Name.Substring(14)} IN ('{strCondition}')";
                            }
                        }
                    }
    Merci d'avance pour une éventuelle aide...

  7. #7
    Membre du Club
    Homme Profil pro
    Alternant
    Inscrit en
    Octobre 2019
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Alternant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 48
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par Codin06 Voir le message
    Donc suite à vos propositions je me suis inspiré un peu des deux et voici mon code, je ne suis plus très loin. Il me manque cependant un détail : lorsque ma boucle passe sur la variable locale item, elle reconnait bien l'item de la ListBox sélectionné mais ensuite ma variable strCondition ne va pas l'ajouter... si il voit null Il va simplement ajouter la virgule "," de strCondition += $"{item}," ou m'afficher "Currency IN ('System.Data.DataRowView')" si il détecte un item sélectionné...

    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
    foreach (Control ctrl in ctrlContainer.Controls)
                {
                    strCondition = null;
                    ListBox lb = ctrl as ListBox;
                    if ((lb != null) && (lb.Name.Contains("Funds")))
                    {
                        string item = lb.SelectedItem as string;
                        strCondition += $"{item},";
     
                        if (strCondition.Length > 1)
                        {
                            if (strWhere == null)
                            {
                                strCondition = strCondition.TrimEnd(',');
                                strWhere += $"{ctrl.Name.Substring(14)} IN ('{strCondition}')";
                            }
                            else if (strWhere != null)
                            {
                                strCondition = strCondition.TrimEnd(',');
                                strWhere +=  $" AND {ctrl.Name.Substring(14)} IN ('{strCondition}')";
                            }
                        }
                    }
    Merci d'avance pour une éventuelle aide...
    Pourquoi ne pas tout simplement exécuter une requête avec une condition tout simplement, cela t'éviterai beaucoup de problèmes

  8. #8
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Citation Envoyé par iR3SH Voir le message
    Pourquoi ne pas tout simplement exécuter une requête avec une condition tout simplement, cela t'éviterai beaucoup de problèmes
    Le but de la manœuvre est justement de construire la clause WHERE de cette requête.

    Codin06,
    Ton problème actuel doit venir de la ligne "string item = lb.SelectedItem as string;".
    Si tu n'a pas sélectionné d'item, item va être null.
    Tu peux le tester avec String.IsNullOrEmpty et ne pas ajouter de condition le cas échéant.

Discussions similaires

  1. [c#] Remplir un DataGridView avec plusieurs DataTable
    Par macfred dans le forum Windows Forms
    Réponses: 2
    Dernier message: 23/02/2010, 11h02
  2. Réponses: 3
    Dernier message: 19/08/2009, 17h45
  3. [VB.net] Filtrer un datagridview par un DatetimePicker
    Par collaud_vb dans le forum Windows Forms
    Réponses: 12
    Dernier message: 28/09/2006, 09h09
  4. [C#] méthodes pour filtrer un datagridview ?
    Par tikam dans le forum Windows Forms
    Réponses: 3
    Dernier message: 16/08/2006, 12h24
  5. [C#][Débutant] Comment appeler la meme fonction depuis plusieurs items d un menu
    Par Cazaux-Moutou-Philippe dans le forum Windows Forms
    Réponses: 7
    Dernier message: 27/04/2006, 19h39

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