Filtrowanie DataGridView poprzez Listbox

0

Witam,
To jest mój pierwszy post w takim razie proszę o wyrozumiałość.
Mam problem:
Stworzyłem sobie DataGridView
Uzupełniony jest on wartościami typu String:
"A"; "A"; "B"; "C"; "C"; "C"
Dodatkowo mam ListBox`a a opcją MultiSelect i który też ma wartości:
"A"; "B"; "C"
Teraz przy zaznaczeniu wartości "A" chcę aby wyświetlał mi wszystkie wartości z DGV z wartością "A".
To samo, gdy zaznaczę w ListBoxie wartości A i B to w w DGV ma wyświetlać wszystkie wiersze z wartościami A i B (3 wiersze)
Nie wiem jak napisać funkcję, która umożliwiłaby mi to.
Czy mogę prosić Was o pomoc?

0

Proszę bardzo, przykładowy kod:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _4prog_FiltrowanieDataGridViewByListBox
{
    public partial class Form1 : Form
    {
        private DataTable dt = new DataTable();
        private BindingSource bs = new BindingSource();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // nazwy kolumn mają znaczenie, po tych nazwach będziesz filtrował
            dt.Columns.Add("Id", typeof(string)); // kolumna Id jest typu string, mimo iż mogła by być char, ponieważ elementy w listBoxie są stringami, inaczej filtrowanie nie działało
            dt.Columns.Add("Content", typeof(string));

            dt.Rows.Add(new object[] { 'A', "aaaaaaaaa" });
            dt.Rows.Add(new object[] { 'A', "aaaaaaaaa" });
            dt.Rows.Add(new object[] { 'B', "bbbbbbbbb" });
            dt.Rows.Add(new object[] { 'C', "ccccccccc" });
            dt.Rows.Add(new object[] { 'C', "ccccccccc" });
            dt.Rows.Add(new object[] { 'C', "ccccccccc" });

            bs.DataSource = dt;
            dataGridView1.DataSource = bs;
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                // filtrujemy po kolumnie "Id"
                bs.Filter = string.Format("Id LIKE '%{0}%'", listBox1.SelectedItem.ToString());
            }
            catch (Exception)
            {
            }
        }
    }
}
0

Niestety ta metoda działa tylko dla pojedynczej wartości w ListBoxie.
A jak zrobić to w przypadku, gdy Listbox przyjmuje więcej niż 1 wartość?

0

Poradziłem sobie w taki sposób:

 
private void listbox_SelectedIndexChanged(object sender, EventArgs e)
            {
                String str= "";
                foreach (String item in listbox.SelectedItems)
                {
                    if (str == "") str += "'"+item+"'";
                    else str += ",'"+item+"'";
                }
                }
                bs.Filter = String.Format("[kolumna1] in ({0}) AND [kolumna2] like '%{1}%'", str, textbox.value);

            }
0

@kostek811, jeśli chcesz łączyć wiele stringów, użyj klasy StringBuilder, a nie zwykłej konkatenacji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1