2015-11-03 6 views
0

У меня возникли проблемы при попытке сделать CheckedListBox элементов. В этой программе я загружаю элементы из DataTable в CheckedListBox, он работает в первый раз, но после указания фильтра CheckedListBox забывает обо всех проверенных элементах. Итак, вопрос в том, как заставить его запомнить отмеченные предметы после того, как они были применены?Сделать CheckedListBox Запомнить CheckedItems after Filter

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace AppNumber302 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     DataTable dt = new DataTable(); 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      dt.Columns.Add("id"); 
      dt.Columns.Add("name"); 
      dt.Columns.Add("checked"); 

      dt.Rows.Add(10, "azer1", true); 
      dt.Rows.Add(10, "azer2", true); 
      dt.Rows.Add(10, "azer3", false); 
      dt.Rows.Add(10, "azer4", false); 

      checkedListBox1.DataSource = dt; 
      checkedListBox1.DisplayMember = "name"; 
      checkedListBox1.ValueMember = "id"; 

      PerformCheck(); 
     } 

     private void PerformCheck() 
     { 
      for (int i = 0; i < dt.Rows.Count; i++) 
      { 
       DataRow drv = dt.Rows[i]; 
       bool stat = bool.Parse(drv[2].ToString()); 
       checkedListBox1.SetItemChecked(i, stat); 
      } 
     } 

     private void textBox1_TextChanged(object sender, EventArgs e) 
     { 
      try 
      { 
       DataRow[] dr = dt.Select("name LIKE '%" + textBox1.Text + "%'"); 
       DataTable tmp = dr.CopyToDataTable(); 
       checkedListBox1.DataSource = tmp; 
       checkedListBox1.ValueMember = "id"; 
       checkedListBox1.DisplayMember = "name"; 
      } 
      catch 
      { 
       checkedListBox1.DataSource = new DataTable(); 
      } 
     } 
    } 
} 

ответ

0

Вы перетаскиваете флажок (если вы устанавливаете свойство DataSource). Поэтому работа, которую вы ранее делали в PerformCheck, исчезла. Простым вариантом является вызов метода снова в обработчике TextChanged.

+0

даже называя его снова, после проверки или unckecking, 'CheckedListBox' забывает проверенные/unckecked элементов. –

+0

Ах. Попросите CheckCheck принять данные в качестве параметра и передать в dt в Load и передать tmp в TextChanged. Хорошая причина не использовать переменные класса в частных методах. –

0

Я искал решение подобной проблемы, и, наконец, я решил это самостоятельно, я знаю, что это сообщение устарело, но я надеюсь, что это может помочь кому-то.

Вы можете создать список для сохранения отмеченных элементов, чтобы проверить их снова при перезаписи. я покажу вам пример из моего кода

List<object> checkedItems = new List<object>(); //List to save checked items 
object[] checkListBoxItems = new object[]  //CheckedListBox items 
{ 
"item1","item2","item3","item4","item5" 
} 
//Method called when item is checked in checkedListBox 
private void CheckedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) 
    { 
     if(e.NewValue == CheckState.Checked) 
     { 
      //If item is checked and not already on list, we add it to de list 
      //With this filter we prevent adding the same item multiple times on rebind 
      if (!checkedItems.Contains(checkedListBox1.Items[e.Index])) 
      { 
       checkedItems.Add(checkedListBox1.Items[e.Index]); 
      } 
     } 
     else 
     { 
      //If not checked, we remove it from list 
      checkedItems.Remove(checkedListBox1.Items[e.Index]); 
     } 
    } 

private void TextBox1_TextChanged(object sender, EventArgs e) 
    { 
     //Start update of checkedlistbox and clear items to refill 
     checkedListBox1.BeginUpdate(); 
     checkedListBox1.Items.Clear(); 
     //If there is any text on the filter field 
     if (!string.IsNullOrEmpty(textBox1.Text)) 
     { 
      //We check every item on our original item list (object array) 
      foreach(object item in checkListBoxItems) 
      { 
       //Check if string in textfield matches item (case sensitive) 
       //and adds it to checkedListBox. At this point we should see the item 
       if (item.ToString().Contains(textBox1.Text)) 
       { 
        checkedListBox1.Items.Add(item); 
       } 
      } 
     } 
     else 
     { 
      //If filter string is empty, we add the whole array of items to the list 
      checkedListBox1.Items.AddRange(checkListBoxItems); 
     } 
     //Now checkedListBox is filled with the filtered(or not) items, its time 
     //to check if they where checked previously and check them in the new list 
     if(checkedClients.Count > 0) 
     { 
      foreach (object item in checkedListBoxItems) 
      { 
       if (checkedItems.Contains(item)) 
       { 
        //If item is shown in the list atm (otherwise it will crash) 
        if(checkedListBox1.Items.Contains(item) 
        { 
         checkedListBox1.SetItemChecked(checkedListBox1.Items.IndexOf(item), true); 
        } 

       } 
      } 
     } 

     checkedListBox1.EndUpdate(); 
    } 
Смежные вопросы