Feedback

C# - TreeNode Checked-Eigenschaft "durchreichen"

Veröffentlicht von am 19.03.2009
(2 Bewertungen)
Dieses allgemein gehaltene Code Snippet ändert die Checked-Eigenschaft der Children und Parents eines TreeNodes nach folgender Mimik:

Checked = true:
- Kinder und Kindes-Kinder: Checked = true
- Vater und Großväter: Checked = true

Checked = false:
- Kinder und Kindes-Kinder: Checked = false
- Vater und Großväter:
- Checked = true wenn mind. ein Kind Checked=true
- Sonst Checked = false.
GFU-Schulungen  [Anzeige]

C# Aufbaukurs

Sie haben grundlegende .NET- und C#-Kenntnisse und und wollen diese nun erweitern. Der Aufbaukurs C# führt Sie ein die Arbeit mit Interfaces und Delegates, Generics und Parallel Computing.

VB.NET Aufbau

Sie verfügen nach der Schulung über fundierte Kenntnisse in der Arbeit mit objektorientierten Modellen in VB.NET und können wiederverwendbare Komponenten eigenständig erzeugen.

        private bool supressAfterCheckEvents = false;

        /// <summary>
        /// Wird ausgelöst, wenn ein Element gewählt wurde
        /// </summary>
        /// <param name="sender">Sender des Events</param>
        /// <param name="e">Event Args</param>
        private void laufTree_AfterCheck(object sender, TreeViewEventArgs e)
        {
            if (supressAfterCheckEvents) return;

            supressAfterCheckEvents = true;
            UpdateChildren(e.Node);
            UpdateParent(e.Node);
            supressAfterCheckEvents = false;

            this.ListChanged.Invoke(this, EventArgs.Empty);
        }

        /// <summary>
        /// Ändert die Kinder auf den checked-Status des Vaters
        /// </summary>
        /// <param name="node">Knoten, der geändert wurde</param>
        private void UpdateChildren(TreeNode node)
        {
            foreach (TreeNode treeNode in node.Nodes)
            {
                treeNode.Checked = node.Checked;
                UpdateChildren(treeNode);
            };
        }

        /// <summary>
        /// Akutalisiert den Parent und setzt die Checked-Eigenschaft auf True,
        /// wenn mindestens ein Kind usgewählt wurde
        /// </summary>
        /// <param name="n">Knoten, der geändert wurde</param>
        private void UpdateParent(TreeNode n)
        {
            // Alle Parents auf den Status der Kinder ändern
            TreeNode workingNode = n.Parent;
            while (workingNode != null)
            {
                // Stanadardmäßig deselektiert
                workingNode.Checked = false;

                // Selektieren wenn mindestens ein Knoten ausgewählt wurde
                foreach (TreeNode treeNode in workingNode.Nodes)
                {
                    workingNode.Checked = workingNode.Checked || treeNode.Checked;
                    if (workingNode.Checked) break; // Einmal True ist immer True
                }

                // Neuer Parent ist der Parent des aktuellen Knotens
                workingNode = workingNode.Parent;
            }
        }
Abgelegt unter TreeView, TreeNode, Checked.

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!