Предотвращение циклического связывания событий в элементах управления пользовательского интерфейса при программном обновлении - PullRequest
3 голосов
/ 18 сентября 2011

У меня есть CheckedListBox, который содержит много элементов, которые можно проверить или снять отдельно.

Рядом с этим находятся CheckBox, представляющие надмножества множества элементов напротив.Это три состояния, соответствующие тому, какая часть их элементов выбрана напротив.

И CheckedListBox, и отдельные CheckBox подписываются на проверку событий измененного типа, что вызывает циклическую ссылку и переполнение.Как я могу отключить один от получения событий изменения, когда другой обновляет его, программно?

1 Ответ

2 голосов
/ 18 сентября 2011
void checkBox1_N_CheckStateChanged(object sender, EventArgs e) {
    checkedListBox1.ItemCheck -= this.CheckedListBox1_ItemCheck;
    // Handler body where affecting CheckedListBox1.
    checkedListBox1.ItemCheck += this.CheckedListBox1_ItemCheck;
}

Лучше всего отключить обработчики событий друг друга при обновлении другого.

void CheckedListBox1_ItemCheck(object sender, EventArgs e) {
    //Find which 'i' is affected.
    arrOfCBox[i].cb.CheckStateChanged -= arrOfCBox[i].eh;
    // Handler body where affecting checkBox[i].
    arrOfCBox[i].cb.CheckStateChanged += arrOfCBox[i].eh;
}

где BoxHandler, как минимум:

    class BoxHandler
    {
        public EventHandler eh;
        public CheckBox cb;
    }

По аналогии с WinForms: временно отключить обработчик событий , но, что удивительно, ответ не получил (слишком слишком абстрактно?).

...