Примечание: скорее всего, есть лучший способ сделать это, но это шаблон, который я использовал давным-давно, и тогда он работал.:)
В случае, который вы показали выше, он будет вызываться из listView, и ItemCheckEventArgs e
сообщит вам, установлен флажок или нет.Это фактически говорит вам о состоянии флажка перед проверкой.Поэтому, если флажок снят, а пользователь только что установил флажок, e.CurrentValue
будет CheckState.Unchecked
.
Теперь проблема может возникнуть, если мы попытаемся обновить состояние всех флажков внутри ItemCheck
.Событие состоит в том, что мы будем рекурсивно вызывать событие каждый раз, когда ставим флажок.Одним из способов решения этой проблемы является отслеживание того, вызывает ли пользователь событие (установив флажок) или мы запускаем событие, вызывая item.Checked = true;
.
Что-то вроде этого может помочь:
// Set this to true when our code is modifying the checked state of a listbox item
private bool changingCheckboxState = false;
private void lvBase_ItemCheck(object sender, ItemCheckEventArgs e)
{
// If our code triggered this event, just return right away
if (changingCheckboxState) return;
// Set our flag so that calls to this method inside the
// loop below don't trigger more calls to this method
changingCheckboxState = true;
// Set all the checkboxes to match the state of this one
foreach(ListViewItem item in lvBase.Items)
{
item.Checked = e.CurrentValue != CheckState.Checked;
}
// Now that we're done, set our flag to false again
changingCheckboxState = false;
}