2015-09-09 5 views
0

У меня есть checklistbox в моей программе, который позволяет пользователю контролировать, какая из 9 возможных серий включена на графике. Я сделал это, только две серии можно включить на графике в любое время, используя следующий код:C# - Автоматическая проверка элементов в checklistbox при проверке определенного элемента

//if there are two checked items 
if (e.NewValue == CheckState.Checked && chListBoxChartSeries.CheckedItems.Count >= 2) 
{ 
    //new item cannot be checked 
    e.NewValue = CheckState.Unchecked; 
} 

Это прекрасно работает. Однако сам и мой конечный пользователь обнаружили, что одна конкретная серия (checklistbox и индекс серии 2) не имеет никакого значения, если она не отображается по сравнению с двумя другими сериями (индексы 3 и 4). Я попытался изменить приведенный выше код, чтобы узнать, что элемент в индексе 2 проверен и разрешить мне - или даже автоматически - проверять элементы по соответствующим индексам. Полнофункциональный показано ниже:

private void chListBoxChartSeries_ItemCheck(object sender, ItemCheckEventArgs e) 
    { 
     int indexA = 2; 
     //specify indexes for related parameters 
     int indexB = 3; 
     int indexC = 4; 
     //give positive checkstate 
     CheckState autochecked = CheckState.Checked; 

     if (chListBoxChartSeries.CheckedItems.Contains(chListBoxChartSeries.Items[indexA])) 
     { 
      //do not limit number of checked items 
      //apply checkstates to items at this index 
      chListBoxChartSeries.SetItemCheckState(indexB, autochecked); 
      chListBoxChartSeries.SetItemCheckState(indexC, autochecked); 
     } 
     else //does not contain item at index 2 
     { 
      //if there are two checked items 
      if (e.NewValue == CheckState.Checked && chListBoxChartSeries.CheckedItems.Count >= 2) 
      { 
       //new item cannot be checked 
       e.NewValue = CheckState.Unchecked; 
      } 

     } 
    } 

Это забросила все виды ошибок на меня, хотя ни один из них не был особенно информативным и ответы, которые я нашел их на этом форуме, кажется, не относятся к мой вопрос! Я действительно не знаю, как далеко я от достижения того, чего я пытаюсь достичь, поэтому любые слова совета или точки в правильном направлении будут огромной помощью!

Спасибо, Марк

ответ

1

Проблема заключается в том, что вы создаете бесконечный цикл здесь. Когда вы выбираете элемент 2, он не сразу добавляется к chListBoxChartSeries.CheckedItems до некоторого времени после завершения этого метода. Поэтому он не будет запускать первую часть вашего оператора if на первой итерации, поэтому пункты 3 и 4 автоматически не будут проверяться.

Позже, когда вы вручную выберете, скажем, пункт 3, это будет запустить первую часть. Однако, как только он доходит до chListBoxChartSeries.SetItemCheckState(indexB, autochecked);, он снова запускает событие. Он дойдет до той же линии и повторит процесс на неопределенный срок.

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

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) 
{ 
    int indexA = 2; 
    //specify indexes for related parameters 
    int indexB = 3; 
    int indexC = 4; 
    //give positive checkstate 
    CheckState autochecked = CheckState.Checked; 

    if (e.Index == indexA && !chListBoxChartSeries.CheckedItems.Contains(chListBoxChartSeries.Items[indexA])) 
    { 
     //do not limit number of checked items 
     //apply checkstates to items at this index 
     chListBoxChartSeries.SetItemCheckState(indexB, autochecked); 
     chListBoxChartSeries.SetItemCheckState(indexC, autochecked); 
    } 
    else //does not contain item at index 2 
    { 
     //if there are two checked items 
     if (chListBoxChartSeries.CheckedItems.Contains(chListBoxChartSeries.Items[indexA]) && !(e.Index == indexB || e.Index == indexC)) 
     { 
      if (e.NewValue == CheckState.Checked && chListBoxChartSeries.CheckedItems.Count >= 2) 
      { 
       //new item cannot be checked 
       e.NewValue = CheckState.Unchecked; 
      } 
     } 
    } 
} 
+0

Привет, спасибо за ваш ответ. Я тестировал это и, похоже, работает на начальном этапе, я уверен, что смогу очистить любые проблемы, которые он бросает на меня отсюда! Спасибо @MichaelMcMullin – marcuthh

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

  • Нет связанных вопросов^_^