CheckedListBox с функцией поиска не проверяет правильно

У меня странные проблемы с контролем флажка в C# .Net
Мой код ниже показывает всю необходимую логику - _itemsChecked - это частный словарь, содержащий все _fixtures и являются ли они истинными или ложными (проверено или не проверено)

Что я хочу, так это иметь возможность искать в моем контрольном списке, сохраняя те, которые были проверены ранее. Если отмеченный элемент включен в результаты поиска, я хочу, чтобы он был проверен.

Код почти работает! Но по какой-то причине ящики случайно отмечены здесь и там, и кажется, что они работают через отладку, но когда экран возвращается к элементу управления, он не работает.

Конечно, я упускаю что-то очень простое.

Моя логика такова:

DataSource включает в себя те, которые соответствуют типизированному поисковому запросу. Выполните итерацию по этому списку и проверьте, верно ли Guid в словаре. Если это правда, тогда мы устанавливаем это как проверено.

Надеюсь, я предоставил адекватную информацию.

Спасибо заранее.

 private void searchTextBox_KeyUp(object sender, EventArgs e)
        {
            lst.DataSource = _fixtures
                .OrderBy(f => 
                    f.Description)
                .Where(f => 
                    f.Description.ToLower().Contains(searchFixturesTextBox.Text.ToLower()))
                .ToList();

            lst.DisplayMember = "Description";

            for (var i = 0; i < lst.Items.Count; i++)
                if(_itemsChecked.Contains(new KeyValuePair<Guid, bool>(((Fixture)lst.Items[i]).Guid, true)))
                    lst.SetItemChecked(i, true);
        }

        void lst_ItemCheck(object sender, ItemCheckEventArgs e)
        {
            var selectedItem = ((ListBox) sender).SelectedItem as Fixture;

            if (selectedFixtureItem != null)
                _itemsChecked[selectedItem.Guid] = e.CurrentValue == CheckState.Unchecked;
        }

1 ответ

Решение

Итак, я собрал это из нескольких примеров, которые я нашел. Большая часть работы была получена из Как заставить ListBox обновить текст элемента?

public class Employee
{
   public string Name { get; set; }
   public int Id { get; set; }
   public bool IsChecked { get; set; }

   public override string ToString()
   {
      return Name;
   }
}

public partial class Form1 : Form
{
   // Keep a bindable list of employees
   private BindingList<Employee> _employees;

   public Form1()
   {
      InitializeComponent();
      // Load some fake employees on load
      this.Load += new EventHandler(Form1_Load);
      // Click once to trigger checkbox changes
      checkedListBox1.CheckOnClick = true;
      // Look for item check change events (to update there check property)
      checkedListBox1.ItemCheck += 
         new ItemCheckEventHandler(CheckedListBox_ItemCheck);
   }

   // Load some fake data
   private void Form1_Load(object sender, EventArgs e)
   {
      _employees = new BindingList<Employee>();
      for (int i = 0; i < 10; i++)
      {
         _employees.Add(new Employee() 
            { Id = i, Name = "Employee " + i.ToString() });
      }

      // Display member doesnt seem to work, so using ToString override instead
      //checkedListBox1.DisplayMember = "Name";
      //checkedListBox1.ValueMember = "Name";
      checkedListBox1.DataSource = _employees;

      // Another example databind to show selection changes
      txtId.DataBindings.Add("Text", _employees, "Id");
      txtName.DataBindings.Add("Text", _employees, "Name");
   }

   // Item check changed, update the Employee IsChecked property
   private void CheckedListBox_ItemCheck(object sender, ItemCheckEventArgs e)
   {
      CheckedListBox clb = sender as CheckedListBox;
      if (clb != null)
      {
         Employee checked_employee = clb.Items[e.Index] as Employee;
         if (checked_employee != null)
         {
            checked_employee.IsChecked = (e.NewValue == CheckState.Checked);
         }
      }
   }

   // Just a simple test that removes an item from the list, rebinds it
   // and updates the selected values
   private void btnChangeList_Click(object sender, EventArgs e)
   {
      _employees.RemoveAt(1);
      checkedListBox1.DataSource = _employees;

      for (var i = 0; i < checkedListBox1.Items.Count; i++)
      {
         Employee employee_to_check = checkedListBox1.Items[i] as Employee;
         if (employee_to_check != null)
         {
            checkedListBox1.SetItemChecked(i, employee_to_check.IsChecked);
         }
      }
   }
}
Другие вопросы по тегам