Как установить флажок в CheckedListBox, когда элементы в списке являются пользовательскими объектами в приложении формы окна C #? - PullRequest
0 голосов
/ 04 февраля 2019

Я создаю форму окна "Экспорт в Excel" в C #.Класс содержит CheckedListBox и кнопку «проверить все».При нажатии на кнопку я хочу проверить все элементы в списке на случай, если хотя бы один флажок не установлен, или снять все флажки на случай, если они все уже отмечены.

enter image description here

Я добавил небольшое усложнение, список элементов - это список пользовательских объектов (см. Закрытый класс внутри): класс "ObjectToExport".

public partial class ExcelCustomExportForm : Form
{
    private class ObjectToExport 
    {
        private readonly IExcelExportable _form;
        public ObjectToExport(IExcelExportable form)
        {
            _form = form;
        }
        public override string ToString()
        {
            return $"{_form.FormName} ({_form.CreatedDate.ToShortDateString()} {_form.CreatedDate.ToShortTimeString()})";
        }
    }

    // each form in the list contains a gridview which will be exported to excel
    public ExcelCustomExportForm(List<IExcelExportable> forms)
    {
        InitializeComponent();
        Init(forms);
    }

    private void Init(List<IExcelExportable> forms)
    {
        foreach (IExcelExportable form in forms)
        {
            // Checked List Box creation
            FormsCheckedListBox.Items.Add(new ObjectToExport(form));
        }
    }

    private void CheckAllButton_Click(object sender, EventArgs e)
    {
        // checking if all the items in the list are checked
        var isAllChecked = FormsCheckedListBox.Items.OfType<CheckBox>().All(c => c.Checked);
        CheckItems(!isAllChecked); 
    }

    private void CheckItems(bool checkAll)
    {
        if (checkAll)
        {
            CheckAllButton.Text = "Uncheck All";
        }
        else
        {
            CheckAllButton.Text = "Check All";
        }

        FormsCheckedListBox.CheckedItems.OfType<CheckBox>().ToList().ForEach(c => c.Checked = checkAll);
    }
}

Проблема в том, чточто следующая строка возвращает true, даже если не установлен флажок:

var isAllChecked = FormsCheckedListBox.Items.OfType<CheckBox>().All(c => c.Checked);

Аналогичная проблема со следующей строкой, если checkAll имеет значение true, флажок не установлен:

FormsCheckedListBox.CheckedItems.OfType<CheckBox>().ToList().ForEach(c => c.Checked = checkAll);

Как правильно исправить эти две строки кода?

1 Ответ

0 голосов
/ 04 февраля 2019

Ваша проблема начинается здесь.

FormsCheckedListBox.Items.Add(new ObjectToExport(form));

и

var isAllChecked = FormsCheckedListBox.Items.OfType<CheckBox>().All(c => c.Checked);

Вы добавляете экземпляры 'ObjectToExport' в FormsCheckedListBox, но во время фильтрации вы проверяете фильтрацию с помощьюCheckBox.

Это означает, что ваш отфильтрованный запрос всегда возвращает пустой, а запрос никогда не достигает All.Это можно продемонстрировать на следующем примере.

var list = new [] { 1,2,3,4};
var result = list.OfType<string>().All(x=> {Console.WriteLine("Inside All"); return false;});

Результатом выше будет True, и он никогда не напечатает текст «Inside All».Это то, что происходит с вашими запросами.

Вы можете узнать, установлен ли какой-либо из флажков, используя

var ifAnyChecked = checkedListBox1.CheckedItems.Count !=0;

Чтобы изменить состояние, вы можете сделать следующее.

for (int i = 0; i < checkedListBox1.Items.Count; i++)
{
    if (checkedListBox1.GetItemCheckState(i) == CheckState.Checked)
   { 
         // Do something

   }
}
...