отмените подписку на событие, прежде чем установить:
check1.CheckChanged -= check1_CheckChanged;
тогда вы можете программно установить значение без флажка, запускающего его событие CheckChanged:
check1.Checked = true;
затем переподписаться:
check1.CheckChanged += check1_CheckChanged;
[РЕДАКТИРОВАТЬ: 29 марта 2012 г.]
Проблема с подходом Tanvi заключается в том, что вам нужно перехватить все источники ручной проверки или снять отметку . Не то чтобы их было слишком много (это только от щелчка мышью и от нажатия клавиши пробела), но вы должны рассмотреть возможность вызова рефакторированного события из MouseClick и KeyUp (обнаружение пробела)
Лучше, чтобы CheckBox (любой элемент управления) не зависел от источника пользовательского ввода (клавиатуры, мыши и т. Д.), Поэтому для этого я просто сделаю программную настройку CheckBox действительно программной. Например, вы можете перенести программную настройку свойства в метод расширения:
static class Helper
{
public static void SetCheckProgrammatically(
this CheckBox c,
EventHandler subscribedEvent, bool b)
{
c.CheckedChanged -= subscribedEvent; // unsubscribe
c.Checked = b;
c.CheckedChanged += subscribedEvent; // subscribe
}
}
Используя этот подход, ваш код может аккуратно реагировать как на ввод данных с мыши, так и с клавиатуры пользователя только через одно событие, т.е. через CheckChanged. Нет дублирования кода, нет необходимости подписываться на несколько событий (например, клавиатура, проверка / снятие флажка CheckBox нажатием пробела)