Laden...

Treeview durchsuchen ohne flackern

Erstellt von admirandis vor 14 Jahren Letzter Beitrag vor 14 Jahren 4.492 Views
admirandis Themenstarter:in
72 Beiträge seit 2009
vor 14 Jahren
Treeview durchsuchen ohne flackern

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 °_° --->

3.170 Beiträge seit 2006
vor 14 Jahren

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

admirandis Themenstarter:in
72 Beiträge seit 2009
vor 14 Jahren

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 °_° --->

5.299 Beiträge seit 2008
vor 14 Jahren

Bei Treeview kommt tv.BeginUpdate/tv.EndUpdate häufig suppagutt.

Der frühe Apfel fängt den Wurm.

Gelöschter Account
vor 14 Jahren

das treeviewcontrol ist eines der wenigen .net controls, die sehr winapi lastig sind. suspendlayout wird dir da nciht helfen aber das erwähnte beginupdate oder falls vorhanden beginedit und die entsprechenden -end methoden wirken sehr wohl.

3.170 Beiträge seit 2006
vor 14 Jahren

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

admirandis Themenstarter:in
72 Beiträge seit 2009
vor 14 Jahren

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 °_° --->

3.170 Beiträge seit 2006
vor 14 Jahren

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

admirandis Themenstarter:in
72 Beiträge seit 2009
vor 14 Jahren

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 °_° --->

F
10.010 Beiträge seit 2004
vor 14 Jahren

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.

admirandis Themenstarter:in
72 Beiträge seit 2009
vor 14 Jahren

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 °_° --->

Gelöschter Account
vor 14 Jahren

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....

admirandis Themenstarter:in
72 Beiträge seit 2009
vor 14 Jahren

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 °_° --->

Gelöschter Account
vor 14 Jahren

man kann auch anders aufklappen.. du musst ja nciht "ensurevisible" verwenden um knoten aufzuklappen....

admirandis Themenstarter:in
72 Beiträge seit 2009
vor 14 Jahren

Könntest du das etwas genauer erklären?f

<--- Sir, we are surrounded!! <-> Perfect! We can attack in any direction °_° --->

5.299 Beiträge seit 2008
vor 14 Jahren

Guck dir mal die Treenode-Methoden im Objectbrowser an.

Der frühe Apfel fängt den Wurm.

T
219 Beiträge seit 2006
vor 14 Jahren

Node.Collapse bzw. Node.Expand solltest Du Dir ansehen...

admirandis Themenstarter:in
72 Beiträge seit 2009
vor 14 Jahren

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 °_° --->

T
219 Beiträge seit 2006
vor 14 Jahren

Du kannst dich doch über Node.Parent "hochhangeln", wenn es keinen Parent mehr gibt dann bist Du auf der Rootebene.

admirandis Themenstarter:in
72 Beiträge seit 2009
vor 14 Jahren

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 °_° --->

T
219 Beiträge seit 2006
vor 14 Jahren

EnsureVisible() sorgt meiner Ansicht nach dafür, dass der Knoten sichtbar wird. Expand klappt auf, der Knoten muss aber nicht unbedingt sichtbar sein.

admirandis Themenstarter:in
72 Beiträge seit 2009
vor 14 Jahren

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 °_° --->

5.299 Beiträge seit 2008
vor 14 Jahren

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.

admirandis Themenstarter:in
72 Beiträge seit 2009
vor 14 Jahren

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 °_° --->

Gelöschter Account
vor 14 Jahren

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.