Как я могу отфильтровать DataGridView, проверив несколько элементов в CheckedListBox?

#c# #checkedlistbox

#c# #checkedlistbox

Вопрос:

У меня есть этот код для фильтрации моего DataGridView с помощью CheckedListBox. Каждый раз, когда пользователь устанавливает флажок в CheckedListBox, DataGridView автоматически обновляется, чтобы отображать только данные, связанные с проверяемым именем (например, фильтруется по checked name = «John»), и это работает довольно хорошо.

 private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
    {
                DataTableCollection tables = myDatabaseDataSet.Tables;
                DataView view = new DataView(tables[0]);
                BindingSource source = new BindingSource();
                source.DataSource = view;
                dataGridView1.DataSource = source;
                source.Filter = "myColumnName ='"   checkedListBox1.Text.Replace("'", "''")   "'";
        }
  

Теперь вопрос в том, как я мог бы сделать так, чтобы несколько элементов в CheckedListBox проверялись, и, в свою очередь, DataGridView обновлялся, показывая только проверенные имена (например, проверенные имена в CheckedListBox — «Джон» и «Джейн»)?

Приведенный выше код дает мне следующий результат:

Код выше

Чего я хочу добиться, так это (издевательская картинка):

Желаемый результат

Любая помощь приветствуется.

Комментарии:

1. Имя не может быть John * и Jane . использовать ИЛИ

2. Должна быть первичная сортировка (вы не можете сортировать по Джону и Джейн одинаково), которую вы могли бы отсортировать по Джону, затем вторичная сортировка по Джейн; это то, что вам нужно?

3. Что я ищу, так это иметь datagridview со всеми отфильтрованными именами, кроме тех, у которых есть флажок в CheckedListBox. Приведенный выше код уже содержит одно имя за раз. Мне нужно несколько имен одновременно.

4. @StevenByrne да, до тех пор, пока datagridview отображает оба имени вместе в одном списке DataGridView.

5. Если ответ kalamazoowho не решает вашу проблему, пожалуйста, обновите свой вопрос желаемыми результатами, поскольку я немного запутался в том, чего вы хотите достичь. Вы хотите изменить столбцы или отсортировать строки данных? Если вы пытаетесь ОТСОРТИРОВАТЬ по именам, Джон, затем Джейн, затем Билл, Кэти, это будет отличаться от того, если вы хотите, чтобы Джон Джейн Билл и Кэти отображали все и исключали все остальные данные.

Ответ №1:

Таким образом, у вас будет база данных, которая приведет к некоторой форме «Выбрать отдельное имя из базы данных» для заполнения CheckedListBox. Итак, теперь вам нужно будет добавить что-то вроде:

 List<string> names = new List<string>();
for (int i = 0; i < checkedListBox.Items.Count; i  ) 
{
    CheckState st = checkedListBox.GetItemCheckState(checkedListBox.Items.IndexOf(i));
    if(st == CheckState.Checked)
    {
        int selected = checkedListBox.SelectedIndex;
        if (selected != -1)
        {
            names.Add(checkedListBox.Items[selected].ToString());
        }
    }
}  
  

Результатом этого будет список элементов в CheckedListBox, которые отмечены. Затем вы можете использовать это с кодом, который я дал ранее для фильтрации. Просто замените жестко заданные имена на строки списка с проверкой.

 string filterString = "";
int count = 0;
foreach (name in names)
{
    if (count != 0)
    {
        filterString  = " OR Responsible = '"   name   "'";
    }
    else
    {
        filterString  = "Responsible = '"   name   "'";
    }
    count  = 1;
}
  

Теперь у вас есть строка, которую можно использовать в качестве фильтра для создания DataView:

 DataView view = new DataView(tables[0], filterString, "Responsible Desc", DataViewRowState.CurrentRows);
  

Это должно фильтровать таблицу, когда она становится представлением данных, а не после, на основе состояний флажка.

Заключительное событие:

 private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
    DataTableCollection tables = myDatabaseDataSet.Tables;

    //
    // Place all my code here
    //

    BindingSource source = new BindingSource();
    source.DataSource = view;
    dataGridView1.DataSource = source;
}
  

Комментарии:

1. Идея состоит в том, чтобы конечный пользователь фильтровал таблицу по именам по мере необходимости, используя CheckedListBox. Список имен варьируется в зависимости от того, что находится в Access, поэтому я не могу иметь жестко закодированные имена в списке.

2. Пожалуйста, проверьте мой обновленный вопрос. Мне нужно, чтобы конечный пользователь установил флажки, которые, в свою очередь, будут фильтровать DataGridView.

3. Я изменил порядок своего ответа выше. Он должен делать именно то, что вы пытаетесь сделать. Поместите его в событие, которое вызывается всякий раз, когда флажок установлен или снят. Я полагаю, что это событие, в котором вы разместили свой код.