2011-10-14 3 views
1

C# .Net의 확인란 컨트롤에 이상한 문제가 있습니다.
아래 코드는 필요한 모든 논리를 보여줍니다. _itemsChecked는 모든 _fixtures가 포함 된 개인 사전이며 진위 또는 거짓 (체크 또는 체크하지 않음)검색 기능이 올바로 검사되지 않는 CheckedListBox

내가 원하는 것은 이전에 체크 된 것을 유지하면서 내 체크리스트를 검색 할 수 있습니다. 선택한 항목이 검색 결과에 포함되어 있으면 해당 항목을 확인해야합니다.

코드가 거의 작동합니다. 그러나 어떤 이유로 박스는 무작위로 여기저기서 검사되며 디버그를 통해 작동하는 것으로 보이지만 화면이 컨트롤로 돌아 오면 작동하지 않습니다.

확실히 나는 아주 간단한 것을 놓치고 있습니다.

내 논리는 다음과 같습니다

데이터 소스이 목록을 통해 입력 된 검색 질의, 으로 반복과 일치 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; 
     } 
+0

관련 : http://stackoverflow.com/q/4654056/95573 – SwDevMan81

+0

'_itemsChecked.Contains (새 KeyValuePair (((기구) lst.Items [I]) .Guid, true))'- 비효율적 인 것처럼 보입니다. LINQ가 전체 컬렉션을 반복 할 수 있다고 생각합니다. 이것이 "plain".net 사전이라면'bool isUnchecked;를 정의하지 말고 다음을 사용하십시오 :'_itemsChecked.TryGetValue (((Fixture) lst.Items [i]) .Guid, out isUnchecked) && isUnchecked'? – Jonno

+0

문제를 해결했지만 답변을 전체적으로 게시 할 수있는 경험이 거의 없습니다. 나는 그 월요일에 할거야. selectedItem가 '= ((리스트 박스) 송신기)에 고정하기 .SelectedItem;' 변화 'VAR selectedFixtureItem = lstFixtures.Items [e.Index]기구로서' –

답변

0

그래서 나는 이것을 몇 가지 예에서 찾아 냈습니다. 작품의 대부분은 How do I make a ListBox refresh its item text?에서 온

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); 
     } 
     } 
    } 
}