Обработчик события ItemChecked

Я использую следующий код, чтобы ограничить количество проверяемых элементов в CheckedListBox до 1:

        private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
    {
        if (checkedListBox1.CheckedItems.Count == 1)
        {
            Boolean isCheckedItemBeingUnchecked = (e.CurrentValue == CheckState.Checked);
            if (isCheckedItemBeingUnchecked)
            {
                e.NewValue = CheckState.Checked;
            }
            else
            {
                Int32 checkedItemIndex = checkedListBox1.CheckedIndices[0];
                checkedListBox1.ItemCheck -= checkedListBox1_ItemCheck;
                checkedListBox1.SetItemChecked(checkedItemIndex, false);
                checkedListBox1.ItemCheck += checkedListBox1_ItemCheck;
            }
            return;
        }
    }

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

    public void ClearChecked()
    {
        foreach (int checkedItemIndex in checkedListBox1.CheckedIndices)
        {
            checkedListBox1.SetItemChecked(checkedItemIndex, false);
        }
    }

3 ответа

Решение

Вы можете создать новую переменную, указывающую, когда событие ItemCheck следует игнорировать:

private shouldIgnoreCheckEvent;

public void ClearChecked()
{
    this.shouldIgnoreCheckEvent = true;

    foreach (int checkedItemIndex in checkedListBox1.CheckedIndices)
    {
        checkedListBox1.SetItemChecked(checkedItemIndex, false);
    }

    this.shouldIgnoreCheckEvent = false;
}

и обновите ваш метод ItemCheck, чтобы проверить, следует ли его игнорировать или нет:

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
    if (!this.shouldIgnoreCheckEvent && checkedListBox1.CheckedItems.Count == 1)
    {
        Boolean isCheckedItemBeingUnchecked = (e.CurrentValue == CheckState.Checked);
        if (isCheckedItemBeingUnchecked)
        {
            e.NewValue = CheckState.Checked;
        }
        else
        {
            Int32 checkedItemIndex = checkedListBox1.CheckedIndices[0];
            checkedListBox1.ItemCheck -= checkedListBox1_ItemCheck;
            checkedListBox1.SetItemChecked(checkedItemIndex, false);
            checkedListBox1.ItemCheck += checkedListBox1_ItemCheck;
        }
        return;
    }
}

Это должно очистить все отмеченные позиции:

 public void UncheckCheckBoxItems(CheckBoxList cbl)
 {
     foreach (ListItem item in cbl.Items)
     {
         item.Selected = false;
     }
 }

Самый простой способ - отключить обработчик события ItemChecked, снять флажок, а затем снова подключить обработчик события. Таким образом, когда вы вызываете SetItemChecked, событие ItemChecked не будет запускаться, и вам не понадобится дополнительный код для управления обработчиком событий. Просто заметил, что вы уже используете этот шаблон внутри вашего события ItemCheck.

public void ClearChecked()     
{         
     try
     {
         checkedListBox1.ItemCheck -= checkedListBox1_ItemCheck;
         foreach (int checkedItemIndex in checkedListBox1.CheckedIndices)         
         {             
             checkedListBox1.SetItemChecked(checkedItemIndex, false);         
         }
     }
     finally
     {
         checkedListBox1.ItemCheck += checkedListBox1_ItemCheck;

     }     
} 

Важно попробовать / наконец, потому что в случае исключений ваш обработчик событий будет переподключен.

Другие вопросы по тегам