2016-10-05 6 views
0

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

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 являются «Джон» и «Джейн «)?

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

Code Above

То, что я хочу, чтобы достичь является это (насмехались картина):

Desired outcome

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

+0

Имени наклоняет Джон ** и * Джейн. use OR – Plutonix

+0

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

+0

Я ищу, чтобы иметь datagridview со всеми фильтрованными именами, но те, которые имеют галочку в checkedListBox. В приведенном выше коде уже есть одно имя за раз. Я хочу несколько имен одновременно. –

ответ

0

Таким образом, у вас будет база данных, которая приведет к некоторой форме «Выбрать различное имя из базы данных», чтобы заполнить 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); 

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

Заключительное мероприятие:

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; 
} 
+0

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

+0

@ P.C проверить обновление – Hank

+0

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