Проблема в событии CheckedChanged

У меня есть флажок, и я подписался для события CheckedChanged. Обработчик делает некоторые операции там. Я проверяю и снял флажок с флажком программно (исключая: chkbx_Name.Checked = true), и событие CheckedChanged запущено.

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

9
задан Jon Seigel 15 May 2010 в 23:19
поделиться

4 ответа

отмените подписку на событие перед тем, как установить:

check1.CheckChanged -= check1_CheckChanged;

, тогда вы можете программно установить значение без срабатывания флажка для его события CheckChanged:

check1.Checked = true;

затем повторно подписаться :

check1.CheckChanged += check1_CheckChanged;

[РЕДАКТИРОВАТЬ: 29 марта 2012 г.]

Проблема подхода Танви в вам нужно поймать все источники вручную или снять отметку с . Не то чтобы их слишком много (только от щелчка мышью и от нажатия пользователем пробела), но вы должны рассмотреть возможность вызова рефакторинга из 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. Нет дублирования кода, нет необходимости подписываться на несколько событий (например, клавиатура, установка / снятие флажка с помощью клавиши пробела)

13
ответ дан 4 December 2019 в 10:31
поделиться

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

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

class Foo : Form {
    private bool checkedProgrammatically = false;

    void someMethod() {
        // ...
        checkedProgrammatically = true;
        checkBox1.Checked = true;
        checkedProgrammatically = false;
        // ...
    }

    private void checkBox1_CheckChanged(object sender, EventArgs e) {
        if (checkedProgrammatically) return;
        // ...
    }
}
5
ответ дан 4 December 2019 в 10:31
поделиться

Вы можете установить логическую переменную перед программным изменением значения и проверить, чем сбросить эту переменную в событии checkedchanged

0
ответ дан 4 December 2019 в 10:31
поделиться

Мне очень жаль, что я не могу просто прокомментировать ответ Майкла Буэна из-за того, что я здесь новичок (без репутации), но, несмотря на то, что оно того стоит, я решительно предпочитаю его решение, чем решение Йоханнеса Рёсселя. пара причин.

1) переменная checkedProgrammatically для меня слишком близка к глобальной. Нет ничего, что могло бы помешать другому методу случайно установить для него значение true, что приведет к остановке всех ваших событий.

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

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

Я широко использовал оба метода и считаю, что Майкл намного проще в долгосрочной перспективе.

1
ответ дан 4 December 2019 в 10:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: