Autor Beitrag
Redfox
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 13.02.06 17:37 
Hallo,

ich habe ein Problem mit dem durchlaufen der Zweige der Ebene 0 mit getNextSibling.
Ich schreibe an einer Projektverwaltung für meine Firma. Darin werden in einem TTreeview die Projekte mit den entsprechenden Unterprojekten dargestellt. In der Datenbanktabelle für die Projekte werden diese mit einer Referenz auf das Überprojekt (Id) gespeichert. Das Ganze wird für jeden Knoten mit gespeichert.
Bei Auswahl eines Projektstatus sollen nur die Hauptprojekte (Projekte ohne Überprojekt) angezeigt werden. Die Unterprojekte sollen auf jeden Fall angezeigt werden. Um sicher zu gehen das ich auch alle Unterprojekte habe füge ich alle Unterprojekte, egal zu welchem Hauptprojekt diese gehören, zum Treeview hinzu und verschiebe diese dann unter die entsprechenden Überprojekte. Das funktioniert gut. Nun habe ich aber das Problem das ich noch Unterprojekte in meinem Tree habe die sich in der ersten Ebene befinden. Diese möchte ich mit dem jeweiligen Zweig löschen.

Ich will also alle Knoten der 1. Ebene durchgehen und überprüfen ob diese ein Überprojekt haben. Wenn ich das mache wie ich es angefügt habe, scheint aber getNextSibling nicht richtig zu funktionieren. Ich sehe das auch Knoten Level 1 und größer durchlaufen werden. Was läuft da falsch? Verwende ich getNextSibling falsch?

Gibt es sonst noch eine praktikable Lösung nur Knoten in Level 0 zu durchlaufen?

Ich habe folgenden Code:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
prjnode := PrjTreeview.Items.GetFirstNode;
while (prjnode <> nil) do
begin
  prjidx := prjnode.Index;
  if ((PNodeDaten((PrjTreeview.Items[prjidx]).Data).ParentId > 0) and (PrjTreeview.Items[prjidx].Level = 0)) then
  begin
    helpnode := prjnode.getNextSibling;
    prjnode.DeleteChildren;
    prjnode.Delete;
    prjnode := helpnode;
    helpnode := nil;
  end
  else
  begin
    prjnode := prjnode.getNextSibling;
  end;
end;


Vielen Dank im Voraus.

Daniel
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mi 22.02.06 21:31 
Ist zwar schon ewig her, aber egal.
Ändere die Strategie des Einlesens:
Sortiere alle Projekte und Unterprojekte nach ID / ParentID. Zuerst kommt das Projekt mit der ID X, dann alle Unterprojekte der ParentID X, Dann das Projekt der ID y (y>x), dann alle Unterprojekte der ParentID y...

Dann kannst Du in linearem Zeitaufwand die gesamte Liste einlesen und direkt den Hauptprojekten zuordnen.

_________________
Na denn, dann. Bis dann, denn.
Redfox
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 24.02.06 13:06 
Ich habe mein Problem jetzt folgendermaßen gelöst.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
prjnode := PrjTreeview.Items.GetFirstNode;

    while (prjnode <> nil) do
    begin
      if ((PNodeDaten(prjnode.Data).ParentId > 0) and (prjnode.Level = 0)) then
      begin
        helpnode := prjnode.getNextSibling;
        prjnode.Delete;
        prjnode := helpnode;
      end
      else
      begin
        prjnode := prjnode.getNextSibling;
      end;
    end;

Das Problm war, das ich auf den Index zugegriffen habe, der allerdings in dem Block mit BeginUpdate, EndUpdate nicht aktualisiert wird. Das konnte nicht funktionieren.

Soweit so gut.

Daniel