Когда вы устанавливаете свойство Checked в RadioBox, можете ли вы подавить событие CheckChanged? - PullRequest
6 голосов
/ 17 сентября 2010

Я новичок в C # и Windows Form, но если у меня есть radiobutton и я вызываю radiobutton1.Checked = true, есть ли способ, чтобы он не вызывал событие CheckedChange?Я хочу различать пользователя, нажимающего на радиокнопку, и меня, устанавливающего радиокнопку программно.Возможно ли это?

Ответы [ 6 ]

6 голосов
/ 17 сентября 2010

Хватит пытаться победить дизайн события CheckedChanged.Он специально должен включать программные изменения.

Если вы хотите, чтобы изменения, инициируемые пользователем, а не программные изменения, используйте вместо этого событие Click.(Возможно, вы думаете, что не хотите ограничивать себя щелчками мыши, не беспокойтесь, для этого есть событие MouseClick, Click также включает изменения клавиатуры.)

2 голосов
/ 17 сентября 2010

Очень простой способ:

public void radio_OnCheckChanged(object sender, EventArgs e)
{
   RadioButton r = sender as RadioButton;
   bool isUserChange = r.Tag.Equals(1);
   if (isUserChange) blabla
   else blabla
   r.Tag = null;       
}

public void MyMethod()
{
   radio1.Tag = 1;
   radio.Checked = true;
}

Вы можете использовать любой тип flag, который пользователи не могут сделать нажатием. Но вы можете сделать это с помощью кода.

2 голосов
/ 17 сентября 2010

Вот простой метод использования события, когда вам это нравится.

private bool SuppressRadioButton1Event { get; set; }

private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
    if (!this.SuppressRadioButton1Event)
    {
        MessageBox.Show("Not suppressed!");
    }
}

private void button1_Click(object sender, EventArgs e)
{
    this.SetRadioButton1(false);
}

private void SetRadioButton1(bool checkedOn)
{
    this.SuppressRadioButton1Event = true;
    radioButton1.Checked = checkedOn;
    this.SuppressRadioButton1Event = false;
}
1 голос
/ 17 сентября 2010

Почему ваш код должен заботиться о том, кто проверял радиокнопку?

РЕДАКТИРОВАТЬ: Есть способы обойти это (подкласс, флаг), но не . Единственная «законная» причина, по которой я могу хотеть этого, состоит в том, чтобы предотвратить появление побочного эффекта, когда значение первоначально (программно) отображается, и даже это подозрительно. Переосмыслите побочный эффект, он действительно относится к событию изменения или фиксации?

Больше информации, почему / что поможет. На первый взгляд это похоже на ошибку проектирования.

0 голосов
/ 11 января 2012

Вы можете попытаться прикрепить событие программно.На основании конфигурации моего приложения я проверяю несколько переключателей, но не хочу запускать события.Чтобы подключить событие программно:

chbOptionX.CheckedChanged + = new System.EventHandler (this.chbShowStockBySizeAndColor_CheckedChanged);

0 голосов
/ 17 сентября 2010

Один (хакерский) способ сделать это - создать подкласс 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, у вас есть возможность подавить событие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...