Я хотел немного привести в порядок вещи, поэтому потратил немного времени на тестирование решения для этого.
Джошб прав, объясняя, почему CheckBox ведет себя так, как он.
Поскольку я не знаю, как я обошел это в прошлом году, или даже если бы я сделал (я не могу вспомнить, над чем я работал в то время, чтобы проверить), я составил простое решение /Обходной путь.
public class CheckBox2 : CheckBox
{
protected override bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
{
bool isEventTarget = postCollection["__EVENTTARGET"] == UniqueID;
bool hasChanged = base.LoadPostData(postDataKey, postCollection);
hasChanged = hasChanged || isEventTarget;
return hasChanged;
}
}
Если вы теперь зарегистрируете CheckBox2 на своей странице и используете его вместо стандартных CheckBoxes, вы получите событие CheckedChanged, как вы ожидаете, с отключенными ViewState и AutoPostBack.
Способ, которым это работает, позволяет обычному CheckBox выполнять свою работу с проверкой и проверкой изменений, но затем выполняет дополнительную проверку, чтобы выяснить, не было ли это целью события, вызвавшего обратную передачу.Если он был целью, он возвращает true, чтобы сообщить фреймворку, что нужно вызвать событие CheckedChanged.
Редактировать: Обратите внимание, что это только решает проблему для AutoPostBack на CheckBox.Если PostBack вызывается из чего-либо еще (например, кнопки), событие CheckedChanged по-прежнему демонстрирует наблюдаемую проблему.