Как определить, установлен ли radioButton.Checked программно или щелчком мыши? - PullRequest
2 голосов
/ 26 октября 2008

У меня есть переключатель в форме Windows. Как я могу определить, произошло ли событие CheckChanged из-за того, что пользователь щелкнул или выбрал переключатель, а не для программной установки события с помощью

this.radioButtonAdd.Checked = true;

Я бы хотел, чтобы какой-то код выполнял другое действие в зависимости от того, нажал ли пользователь кнопку или я сам вызвал событие.

Или, может быть, лучший вопрос - как мне обработать событие, когда пользователь нажимает vs, когда состояние изменяется в моем коде.

Ответы [ 3 ]

2 голосов
/ 26 октября 2008

Я думаю, что нашел довольно хороший ответ.

Все элементы управления Windows Forms имеют свойство под названием «Tag». его значением может быть любой объект.

Поэтому, если я хочу внести какие-либо программные изменения, я могу сделать следующее:

radioButton.Tag = "ignore"
radioButton.Checked = true

затем в обработчике события:

private void radioButton_CheckedChanged(object sender, EventArgs e)
{
    if (radioButton.Checked)
    {
        // Tag will be null in cases where the user clicks
        if (this.radioButtonAdd.Tag == null)
        {
            // do something
        }
        else
        { 
            // swallow action
            // reset Tag
            this.radioButtonAdd.Tag = null;
        }
    }
}
2 голосов
/ 26 октября 2008

Если есть встроенный метод, то я не знаю об этом.

Один из способов справиться с этим - установить глобальный флаг, пока код вносит изменения, сообщающие обработчику событий. Например, код, вносящий изменения, может выглядеть примерно так:

savedFlag = modifyingProgrammatically;
modifyingProgrammatically = true;
this.radioButtonAdd.Checked = true;
modifingProgrammatically = savedFlag;

В вашем обработчике событий:

if(modifyingProgramatically) {
    // The event was raised by an assignment within the code.
} else {
    // The event was raised by a user action.
}
1 голос
/ 26 октября 2008

Вы также можете сделать что-то вроде изменения значения поля флага на MouseDown для радиокнопки, а затем возврата значения флага на MouseClick. Так как событие CheckedChanged возникает между ними, он может использовать флаг, прежде чем он будет отменен событием MouseClick, и вам не нужно беспокоиться о сбросе его состояния.

У вас все еще могут быть проблемы с многопоточностью, если вы используете поле в качестве флага (не очень много знаете о приложении, над которым работаете), но что-то вроде этого должно работать:

    private bool _mouseEvent;
    private void radioButton1_CheckedChanged(object sender, EventArgs e)
    {
        if (_mouseEvent)
            MessageBox.Show("Changed by mouse click.");
        else
            MessageBox.Show("Changed from code.");
    }

    private void radioButton1_MouseClick(object sender, MouseEventArgs e)
    {
        _mouseEvent = false;
    }

    private void radioButton1_MouseDown(object sender, MouseEventArgs e)
    {
        _mouseEvent = true;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        // This simulates a change from code vs. a change from
        // a mouse click.
        if (radioButton1.Checked)
            radioButton2.Checked = true;
        else
            radioButton1.Checked = true;
    }

Кроме того, вы можете отделить логику приложения «только щелчок мышью», чтобы она запускалась другим событием (например, MouseClick).

Надеюсь, это поможет.

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