Hallo zusammen,
ich möchte in meinem Programm einen Treeview mit einigermaßen vielen Einträgen durchsuchen und bei Knoten, welche Treffer darstellen den Hintergrund rot markieren und bringe diese noch mit EnsureVisible() in den Vordergrund.
Blöderweise flackert der ganze Treeview bei der suche, was wohl daran liegt, dass ich jeden knoten einzeln anschaue, und bei jedem neuen buchstaben in der Suche den treeview wieder komplett zuklappe, damit er übersichtlich bleibt.
Was ich schon probiert habe: Alle gefundenen Knoten in eine Liste schreiben und am Ende der Suche alle Knoten aus der Liste aufklappen. Leider gleiches Ergebnis.
Falls ihr irgendeine Idee diesbezüglich habt, so wäre ich euch sehr dankbar dafür!
Viele Grüße - Thomy
<--- Sir, we are surrounded!! <-> Perfect! We can attack in any direction °_° --->
Hallo,
ich nehme mal an dass "DoubleBuffered" bereits auf true gesetzt ist -> falls nicht, wäre das der erste Schritt.
Ansonsten könntest Du versuchen, vor den Operationen am TreeView die SuspendLayout()-Methode zu rufen und wenn alles fertig ist ResumeLayout().
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Doublebuffered hab ich noch nicht probiert, aber ich glaub ehrlich gesagt net, dass es hilft, weil so wie ich das sehe der immer wie verrückt hin- und her scrollt. Aber probieren geht über studieren.
Suspend- und Resumelayout hab ich schon probiert, geht aber net!
<--- Sir, we are surrounded!! <-> Perfect! We can attack in any direction °_° --->
Bei Treeview kommt tv.BeginUpdate/tv.EndUpdate häufig suppagutt.
Der frühe Apfel fängt den Wurm.
Hallo,
Falls auch das Begin- und EndUpdate nix nützt, wäre noch eine Möglichkeit, eine halbe Sekunde zu warten ob noch ein weiterer Buchstabe folgt, also die Suche nur dann auszuführen, wenn mind. eine halbe (oder ganze) Sekunde keine Eingabe erfolgt ist.
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Danke euch allen, ich werd das mal heut abend mal ausprobieren, wenn ich heimkomm. Das mit dem Beginupdate klingt vielversprechend! Danke für den Hinweis und ich meld mich, wenn ich mehr weiß!
Cheers Thomy
EDIT @Marsstein: Zwar nicht sehr konventionell, aber wenn alles net klappt wäre das ne überlegung wert. Ist zwar einiges an Arbeit, wenn mans sauber macht (Thread und Co), oder man machts unsauber mit nem Timer 😉 Hoffen wir, dass ich das nicht brauche 😉
<--- Sir, we are surrounded!! <-> Perfect! We can attack in any direction °_° --->
Hallo,
Zwar nicht sehr konventionell,... Richtig.
Das ist eher so ein Trick bei Webanwendungen, wo bei Änderungen eines Textfeldes Ajax-Anfragen abgeschickt werden.
Da gehe ich dann so vor, damit nicht zu viele Anfragen abgesetzt werden, schließlich haben die ja auch meist eine gewisse Laufzeit, und die Antwort könnte sonst beim eintreffen schon nicht mehr aktuell sein...
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Leider muss ich sagen, dass das BeginUpdate() und -End leider auch keine Wirkung haben. Die Scrollbar macht immer noch höchst erschreckende Bewegungen. Wenn ihr wollt kann ich heut abend mal ein Video davon machen...
<--- Sir, we are surrounded!! <-> Perfect! We can attack in any direction °_° --->
Brauchst du nicht zu machen, denn Du bist doch selber Schuld, das es so ist.
EnsureVisible bedeutet doch, das das TreeView zu diesem Eintrag scrollt, ihn ggf expandiert und anzeigt.
Wenn du das aber hunderte male beim suchen machst führt das zu diesem Ergebnis.
Blöderweise hat FZelle absolut recht. Die Suche selber dauert nicht sehr lange, aber wenn man mit der Suche anfänge klappt der Treeview alle knoten die bspweise eine "a" enthalten auf. Das ist so ziemlich jeder.
Lässt sich wohl nicht sauber lösen. Auch mit beginedit nicht. Ich habs nun so gelöst, dass ich erst ab 3 Buchstaben anfange zu suchen. In keinster Weise elegant, aber bei 3 Buchstaben ist es halt wirklich fast nichts mehr zum aufklappen und dementsprechend schneller.
Viele Grüße und danke an alle für die Hilfe - Thomy
<--- Sir, we are surrounded!! <-> Perfect! We can attack in any direction °_° --->
lass halt das ensurevisible erstmal weg, klappe alles auf, was aufgeklappt werden soll (rekursiv bis zum root nciht vergessen) und merke dir einfach immer den letzten treffer, auf dem du dann nach der gesamten aufklappaktion ein ensurevisible aufrufst.
denn alle treffer kann er eh nicht gleichzeitig anzeigen....
Ich glaub nicht, dass das besonders hilfreich wäre. Weil, wie kommt er sonst an die ergebnisse? Dann müsste man jeden Knoten aufmachen um zu schauen, ob da was rot markiert ist...
<--- Sir, we are surrounded!! <-> Perfect! We can attack in any direction °_° --->
Könntest du das etwas genauer erklären?f
<--- Sir, we are surrounded!! <-> Perfect! We can attack in any direction °_° --->
Guck dir mal die Treenode-Methoden im Objectbrowser an.
Der frühe Apfel fängt den Wurm.
Node.Collapse bzw. Node.Expand solltest Du Dir ansehen...
Sorry, wenn ich hier ein Brett vorm Kopf hab, aber:
Mit Node.Expand bzw. Collapse öffne bzw. schließe ich den Knoten. Ok! Aber wenn der Knoten irgendwo in einem tiefgelegenen Knoten ist, dann expandier ich nicht alle übergeordneten Knoten, so dass der Knoten nicht sichtbar ist.
@ErfinderDesRades: Du meinst TreeVIEW-Methoden, oder? Und welche genau?
<--- Sir, we are surrounded!! <-> Perfect! We can attack in any direction °_° --->
Du kannst dich doch über Node.Parent "hochhangeln", wenn es keinen Parent mehr gibt dann bist Du auf der Rootebene.
Und wo genau ist da jetzt der Unterschied zu EnsureVisible()? Der macht das allergleiche?
<--- Sir, we are surrounded!! <-> Perfect! We can attack in any direction °_° --->
EnsureVisible() sorgt meiner Ansicht nach dafür, dass der Knoten sichtbar wird. Expand klappt auf, der Knoten muss aber nicht unbedingt sichtbar sein.
Ok, darin stimmen wir überein. Aber mein Ziel ist es ja, dass der Knoten sichtbar wird! Anscheinend haben wir da etwas aneinander vorbeigeredet...
<--- Sir, we are surrounded!! <-> Perfect! We can attack in any direction °_° --->
Aber du kannst doch nicht alle gleichzeitig sichtbar machen, sondern nur zu einem hinscrollen. (Entweder zum ersten Match oder zum letzten, denkich).
Aber die Scrollbar ändert sich wohl bei beiden, weil sich die Anzahl der Zeilen ja erhöht.
Ich bin etwas überrascht von BeginUpdate - ich dachte nicht, dass bei jedem expandierten Node die Scrollbar rumhopst.
Ansonsten kannste das Neuzeichnen auch ganz abwürgen, indemde WndProc überschreibst, und WM_Paint abfängst.
Dann am Schluß einmal tv.Invalidate(), und das ganze müsste mit einem einzigen Zeichenvorgang über die Bühne gehen.
Der frühe Apfel fängt den Wurm.
Ahh, jetzt versteh ich dich 😃
Du meinst das EnsureVisible zum bestimmten Knoten hinscrollt. Gut möglich. Sogar wahrscheinlich, nachdem was ich gesehen habe. Das wäre natürlich eine Überlegung wert.
Ich bin froh, dass wir uns letztendlich noch verstanden haben 😉
<--- Sir, we are surrounded!! <-> Perfect! We can attack in any direction °_° --->
Du meinst das EnsureVisible zum bestimmten Knoten hinscrollt.
jap.. ensure visible expandiert alle knoten bis zum root und bringt den angegebenen knoten in den angezeigten breich mit hilfe vom scrollen.
das scrollen brauchst du aber nciht, außer beim letzten kefundenen knoten, da du ohnehin nciht alle knoten gleichzeitig anzeigen kannst.
Mit Node.Expand bzw. Collapse öffne bzw. schließe ich den Knoten. Ok! Aber wenn der Knoten irgendwo in einem tiefgelegenen Knoten ist, dann expandier ich nicht alle übergeordneten Knoten, so dass der Knoten nicht sichtbar ist.
deswegen habe ich dir ja bereits gesagt, das du rekursiv bis zum root expandieren musst...
Das wäre natürlich eine Überlegung wert.
das ist sogar eine lösung.