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

  1. #1
    Candidat au Club
    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:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
        string varfilter = "";


    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
    Candidat au Club
    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
    Membre émérite
    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é
    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
    Candidat au Club
    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
    Candidat au Club
    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...

###raw>template_hook.ano_emploi###