Один (хакерский) способ сделать это - создать подкласс RadioButton
и переопределить виртуальный метод OnCheckChanged
, подавляя событие, если свойство Checked
установлено программно.
Однако, поскольку радио-кнопки принадлежат группе, событие всегда срабатывает парами (oen для снятия отметки, один для проверки). Поэтому вы захотите подавить событие для всей группы при программном выборе выбранной кнопки. Вот пример реализации:
public class CustomRadioButton : RadioButton
{
private bool _suppressCheckedEvent;
public void SetChecked(bool value, bool suppressCheckedEvent)
{
if (!suppressCheckedEvent)
Checked = value;
else
{
SetSupressModeForGroup(true);
Checked = value;
SetSupressModeForGroup(false);
}
}
private void SetSupressModeForGroup(bool suppressCheckedEvent)
{
foreach (var crb in Parent.Controls.OfType<CustomRadioButton>())
crb._suppressCheckedEvent = suppressCheckedEvent;
}
protected override void OnCheckedChanged(EventArgs e)
{
if (!_suppressCheckedEvent)
base.OnCheckedChanged(e);
}
}
В этой реализации изменение состояния флажка с помощью свойства Checked
всегда вызывает событие. Когда вы вызываете метод SetChecked
, у вас есть возможность подавить событие.