C# Klicken auf TreeNode ohne diese auszuwählen

AP Nova

Commander
Registriert
Juni 2008
Beiträge
2.256
In einem Programm möchte ich die Möglichkeit bieten, TreeNodes umzusortieren. Das gestaltet sich so, dass man einen bestimmten Knoten auswählt, um den übergeordneten Knoten zu ändern, und dann auf den jeweiligen neuen übergeordneten Knoten klickt. Allerdings hätte ich gerne, dass weiterhin der ursprüngliche Knoten ausgewählt bleibt, was sich als problematisch erweist.

Legt man im Programmcode fest, dass der neue ausgewählte Knoten der "alte", nur woanders einsortiert, ist, macht einem das Klickereignis auf den übergeordneten Knoten nämlich einen Strich durch die Richtung, indem es erst danach verarbeitet wird und somit den übergeordneten und nicht den gewünschten auswählt. Nebenbei verwende ich für das Ändern des übergeordneten Knotens das MouseDown-Ereignis.

Ich habe auch schon versucht, zusätzlich mit den Ereignissen treeview.MouseClick und treeview.NodeMouseClick zu arbeiten, aber hier wird letztendlich auch wieder die Node ausgewählt, auf die geklickt wurde, ohne dass ich dadrauf im Code irgendeinen Einfluss nehmen könnte.

Wie kann man nun unterbinden, dass die Auswahl auf den angeklickten Knoten fällt und dafür sorgen, dass sie bei der eigentlichen TreeNode bleibt?

Danke für eure Hilfe
 
Kannst du mal die entsprechenden Quelltextstellen zeigen?
 
Im Wesentlichen ist es der folgende Ausschnitt. Die Zuweisung von tvTag.SelectedNode macht keine Probleme, nur wird wie gesagt unmittelbar darauf von dem Klickereignis auf den anderen Knoten überschrieben und der andere Knoten ausgewählt.

Code:
this.tvTag.MouseDown += new System.Windows.Forms.MouseEventHandler(this.tvTag_MouseControl);

Code:
void tvTag_MouseControl(object sender, MouseEventArgs e)//Steuert Verhalten bei Klicks
        {
            if (e.Button == MouseButtons.Left && tvTag.GetNodeAt(e.Location) != null)//Bei Linksklick und getroffener Node
            {
                if (Cursor != Cursors.UpArrow)//Nur wenn der Tag nicht verschoben werden soll
                {
                    ...
                }
                else //Wenn ein Tag verschoben werden soll
                {
                    if (tvTag.GetNodeAt(e.Location) != LastSelectedTag && tvTag.GetNodeAt(e.Location) != LastSelectedTag.Parent)
                    {//Nur wenn nicht der alte Tag selbst oder sein Parent gewählt wurde
                        tvTag.SelectedNode = tvTag.GetNodeAt(e.Location).Nodes.Add(LastSelectedTag.Text);//Alten Tag an neues Ziel setzen
                        tvTag.SelectedNode.Tag = LastSelectedTag.Tag;
                        TMC.ParentControl((int)LastSelectedTag.Tag, (int)tvTag.GetNodeAt(e.Location).Tag);
                        LastSelectedTag.Remove();
                    }
                }
            }
            else
            {
                if (e.Button == MouseButtons.Right)//Bei Rechtsklick
                {
                    ...
                }
                else
                {
                    if (Cursor == Cursors.UpArrow)
                    {
                        tvTag.SelectedNode = tvTag.Nodes.Add(LastSelectedTag.Text);//Alten Tag an neues Ziel setzen
                        tvTag.SelectedNode.Tag = LastSelectedTag.Tag;
                        TMC.ParentControl((int)LastSelectedTag.Tag, -1);
                        LastSelectedTag.Remove();
                    }
                }
            }
            Cursor = Cursors.Arrow;
        }
 
Woher soll nun das Programm wissen, das der erste Klick für die Auswahl des Knoten ist und der zweite Klick für das Neusortieren? Wäre da das Drag&Drop nicht vielleicht die "bessere" Alternative? Zumindest wäre es irgendwie klarer getrennt.
 
Zuletzt bearbeitet:
Es gibt so gesehen keinen ersten Klick für die Auswahl des Knotens, das ist nicht das Problem. Das Problem setzt da an, dass man irgendeinen Knoten anklickt und dort dann der andere Knoten hinzugefügt, aber gleichzeitig auch ausgewählt werden soll. Dummerweise wird der angeklickte Knoten aber erst danach ausgewählt und ich habe nicht rausgefunden, wie man das Auswählen eines Knotens beim Anklicken unterbindet. Das ist nämlich das einzige Problem, dass der Knoten bei einem Klick auch ausgewählt wird, egal was man macht.

Aber die Idee zu Drag&Drop ist trotzdem hilfreich, ich werde morgen mal gucken, ob ich das passend umsetzen kann. Immerhin ist es auch intuitiver als meine aktuelle Umsetzung für das Verschieben.
 
Es ist nun zwar eher übermorgen geworden, aber das mit Drag&Drop hat trotzdem gut geklappt und nicht nur die Bedienung, sondern auch den dazugehörigen Code vereinfacht.

Danke für die Hilfe
 
Nunja, soviel Hilfe wars nun auch wieder nicht, eher ein kleiner Denkanstoß. Die ganze Arbeit dahinter hast du schon allein gemacht. Freut mich, dass es läuft.

Viel Spaß weiterhin ...
Rossibaer
 
Zurück
Oben