Обработчик события 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;
}
}
Важно попробовать / наконец, потому что в случае исключений ваш обработчик событий будет переподключен.