иерархические флажки winform

2

У меня есть последовательность флажков на С# Winform. У каждого флажка могут быть некоторые опции, которые на самом деле представляют собой только еще один набор флажков, которые немного отступаются на странице.

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

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

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

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

  • 0
    Я подозреваю, что вы можете использовать событие CheckedChanged, а не событие Click, пожалуйста, опубликуйте код, который вы используете.
Теги:
winforms
checkbox

2 ответа

3
Лучший ответ

Что-то вроде этого должно работать.

    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        if (checkBox1.Focused)
        {
            checkBox2.Checked = checkBox1.Checked;
            checkBox3.Checked = checkBox1.Checked;
            checkBox4.Checked = checkBox1.Checked;
        }
    }

    private void subCheckBox_CheckedChanged(object sender, EventArgs e)
    {
        CheckBox theCheckbox = sender as CheckBox;
        if (theCheckbox.Focused)
        {
            checkBox1.Checked = checkBox2.Checked || checkBox3.Checked || checkBox4.Checked;
        }
    }

Флажки 2, 3 и 4 привязаны к одному и тому же обработчику для моего примера.

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


Очевидно, это делает некоторые предположения, поскольку это всего лишь пример. Я полагаюсь на пользовательский ввод (свойство Focused) для управления потоком. Я уверен, что есть другие решения.

  • 0
    Ах, я вижу, что вы делаете вещи, только если флажок сфокусирован, тем самым избегая цепочек проверок, с которыми у меня есть проблема. Brilliant. Спасибо
2

Вы также можете использовать элемент управления TreeView с TreeView.CheckBoxes = true. Таким образом, вы уже имеете иерархическую структуру по умолчанию.

  • 0
    Я подумал об использовании этого, но мне нужно сделать некоторые странные вещи, которые я не упомянул здесь, которые TreeView не будет поддерживать. Спасибо за предложение все таки

Ещё вопросы

Сообщество Overcoder
Наверх
Меню