2016-10-06 5 views
1

Если у меня есть элемент, который я проверяю, а затем я решил снять флажок, код несколько считает, что он по-прежнему проверяется. В результате, когда я нажимаю «Перейти», в таблице также отображается непроверенный элемент. В этом случае Брэндон был сначала проверен, а затем снят. Несмотря на то, что имя больше не «проверено», таблица все еще поднимает его.C# Элемент в checkedListBox выбирается, даже если флажок не отмечен

Item still checked

Это то, что у меня есть:

string filterstring = ""; 
    private void checkedListBox_ItemCheck(object sender, ItemCheckEventArgs e) 
    { 
     if (e.NewValue == CheckState.Checked) 
      filterstring = "Responsible = '" + checkedListBox.Items[e.Index].ToString() + "' OR"; 
     else 


     if (e.NewValue == CheckState.Unchecked) 
      filterstring = ""; 


     foreach (object itemChecked in checkedListBox.CheckedItems) 
      { 
       filterstring += " Responsible = '" + itemChecked.ToString() + "' OR"; 
      } 
     filterstring = filterstring.Substring(0, filterstring.LastIndexOf("OR")); 
    } 

Я подозреваю, что ключ находится в этой части кода. Без этого оно исключает исключение:

private void checkedListBox_ItemCheck(object sender, ItemCheckEventArgs e) 
    { 
     if (e.NewValue == CheckState.Unchecked) 
      filterstring = ""; 
    } 

Любые помощь приветствуется!

ответ

0

Список проверенных товаров не обновляется до после Событие ItemCheck запускается, поэтому ваш цикл for-each не сообщает о точном проверке элементов.

Чтобы избежать этого, используйте вызов BeginInvoke:

this.BeginInvoke(new Action(() => { 
    foreach (var itemChecked in checkedListBox1.CheckedItems) { 
     filterString += itemChecked.ToString(); 
    } 
    })); 

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

Update:

Поскольку вы получаете исключение на коде подстроки, попробуйте создать текст фильтра, как это:

List<string> filters = new List<string>(); 

void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) { 
    this.BeginInvoke(new Action(() => { 
    filters = new List<string>(); 
    foreach (var itemChecked in checkedListBox1.CheckedItems) { 
     filters.Add("'" + itemChecked.ToString() + "'"); 
    } 
    MessageBox.Show("Responible = " + string.Join(" OR ", filters.ToArray())); 
    })); 
} 
+0

Спасибо Ларс. К сожалению, он оставляет мне исключение: «Необработанное исключение типа« System.ArgumentOutOfRangeException »произошло в mscorlib.dll Дополнительная информация: Длина не может быть меньше нуля." –

+0

@ P.C Если это происходит в вашей строке LastIndexOf, ну, это другая проблема. Ваш LastIndexOf возвращает -1, который вы используете для длины текста, следовательно, kaboom. – LarsTech

+0

Nevermind ... мой плохой, я неправильно установил код. Ваш ответ был с самого начала. –

Смежные вопросы