Фильтр CheckedListBox с TextBox - PullRequest
       30

Фильтр CheckedListBox с TextBox

0 голосов
/ 13 декабря 2018

Я новичок в этом, так что это может быть просто, но я застрял на этом через пару дней.Я пытаюсь реализовать Select All функциональность и фильтрую CheckedListBox, используя TextBox в моей форме.
Что-то вроде фильтра Excel.Аналогично изображению ниже:

excel filter

Я заполняю CheckedListBox массивом.Емкость массива постоянно меняется в зависимости от количества элементов.Это может быть 10 или 20 или выше 50.

То, что я пробовал:

private void checkedListBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (checkedListBox1.GetItemChecked(0) == true)
            SelectDeselectAll(true);
        else if (checkedListBox1.GetItemChecked(0) == false)
            SelectDeselectAll(false);
        //when select all is checked, and I uncheck a item in the list, uncheck select all and the item
        else //if (checkedListBox1.GetItemChecked(0) == true && checkedListBox1.GetItemChecked(0) )
            SelectDeselectAll(null);
    }

    private void SearchBox_TextChanged(object sender, EventArgs e)
    {
        string filter_param = SearchBox.Text.ToUpper();
        var item = checkedListBox1.Items.Cast<string>().ToList();
        List<string> filteredItems = item.FindAll(x => x.StartsWith(filter_param));

        checkedListBox1.DataSource = filteredItems;

        // if all values removed, bind the original full list again
        if (String.IsNullOrWhiteSpace(SearchBox.Text))
        {
            checkedListBox1.DataSource = cboxAr;
        }
    }

    private void SelectDeselectAll(bool? v)
    {
        if (v == true)
        {
            for (int i = 1; i < checkedListBox1.Items.Count; i++)
                checkedListBox1.SetItemChecked(i, true);
        }
        else if (v == false)
            checkedListBox1.ClearSelected();
        else if (v == null)
        {
            IEnumerable<int> notChecked = (from int item in checkedListBox1.Items
                                           where !checkedListBox1.CheckedIndices.Contains(item)
                                           select item);

            if (checkedListBox1.GetItemChecked(0) == true)
            {
                SelectDeselectAll(false); 
                foreach (int j in notChecked)
                    checkedListBox1.SetItemChecked(j, true);
            }
        }
    }

После отладки : выбор всех функций работает хорошо.Но когда я фильтрую и пытаюсь выбрать отфильтрованные элементы, реализуется часть if, и управление переходит к SelectDeselectAll(true).

Кроме того, не работает следующее: когда я выбираю все, а затем снимаю галочку с одного изэлементы в списке, это не сработает.

Я не знаю, где я иду не так.Кто-нибудь может указать мне правильное направление?

1 Ответ

0 голосов
/ 13 декабря 2018

возможно попробуйте что-нибудь более простое:

    private void checkedListBox1_SelectedValueChanged(object sender, EventArgs e)
    {
        if (checkedListBox1.SelectedIndex == 0)
        {
            for (int i = 0; i < checkedListBox1.Items.Count; i++)
            {
                checkedListBox1.SetItemCheckState(i, checkedListBox1.GetItemCheckState(0));
            }
        }
        else //if you unchecked one of the other checkbox when select all is checked, then the select all is unchecked 
        {
            if (checkedListBox1.GetItemCheckState(0) == CheckState.Checked)
            {
                checkedListBox1.SetItemCheckState(0, CheckState.Unchecked);
            }
        }
    }

    private void SearchBox_TextChanged(object sender, EventArgs e)
    {
        List<string> filtered= cboxAr.AsEnumerable()
            .Where(x => x.ToUpper().Contains(SearchBox.Text.ToUpper()))
            .ToList();

        checkedListBox1.DataSource = filtered;
        if (String.IsNullOrWhiteSpace(SearchBox.Text))
        {
            checkedListBox1.DataSource = cboxAr;
        }
    }

убедитесь, что вы изменили событие на SelectedValueChanged, а также сделайте событие DoubleClick для вызова этого события.

Я рекомендуюдобавьте эти строки, когда вы присваиваете начальные значения CheckBoxList:

checkedListBox1.SelectedValueChanged -= checkedListBox1_SelectedValueChanged;
checkedListBox1.DataSource = cboxAr;
checkedListBox1.SelectedValueChanged += checkedListBox1_SelectedValueChanged;

, потому что при назначении данных для источника данных значение тоже меняется, и событие происходит

, поэтому у вас должно быть 4 ссылки на это событиев целом.enter image description here

...