Datenbankeinträge in Treeview laden

Hi,

ich bin dabei Daten aus einer Datenbank auf einer SharePoint Seite mittels eines Webparts darzustellen. Konkret geht es darum, alle Unterwebs einer Webanwendung anzuzeigen. Da die Unterwebs auch nochmal Unterseiten haben können, will ich das in einer Treeview machen. Die Adresse einer Seite wäre also ein Oberpunkt und alle weiteren Seiten mit dem selben URL wären unterhalb des Oberknotens.

Ich kann eine Treeview erzeugen und ich kann die Datenbankabfrage machen. Es hakt bei mir aber dabei, die Daten in die Treeview zu bekommen.
Hier mal mein bisheriger Code:

Code:
{
                // Verbindung zur Datenbank aufbauen
                SqlConnection con = new SqlConnection(
                                "Data Source=/*hier ServerIP rein*/;" + 
                                "Initial Catalog=SharePoint_Content_NameDerWebanwendung;Connect Timeout=30;" +
                                "Trusted_Connection=yes");

                // Verbindung öffnen
                con.Open();

                // SQL-Statement erzeugen
                string strSQL = "SELECT distinct a.FullUrl " +
                                "FROM dbo.Webs a, dbo.Webs b " +
                                "WHERE a.FirstUniqueAncestorWebId = b.FirstUniqueAncestorWebId " +
                                "AND a.FullUrl LIKE ('client%') " +
                                "ORDER BY FullUrl asc";

                // Command-Objekt erzeugen und Statement übergeben
                SqlCommand cmd = new SqlCommand(strSQL, con);

                // Reader erzeugen
                SqlDataReader dr = cmd.ExecuteReader();

                // Treeview erzeugen
                TreeView tr = new TreeView();
                tr.Size = this.ClientSize;


                /* Hier denke ich, müsste ermittelt werden, wie groß die TreeNode
                Arrays überhaupt sein sollen. Da Oberknoten wie 'client/asdf-testseite'
                aussehen, könnte man vielleicht irgendwie zählen, wie viele DB-Einträge
                nur ein einziges Slash haben, und diese Zahl für das Array nehmen */


                TreeNode[] tn = new TreeNode[50];
                TreeNode[] tcn = new TreeNode[50];
                while (dr.Read())
                {
                    for (int i = 0; i < 1; i++)
                    {
                        tn[i] = new TreeNode();
                        tn[i].Text = (dr["FullUrl"].ToString());
                        tr.Nodes.Add(tn[i]);
                        tn[i].Collapse();

                        for (int j = 0; j < 1; j++)
                        {
                            tcn[j] = new TreeNode();
                            tcn[j].Text = (dr["FullUrl"].ToString());
                            tr.Nodes[i].Nodes.Add(tcn[j]);
                        }
                        this.Controls.Add(tr);
                    }

                    string satz = dr.ToString;
                    int zaehler = 0;
                    char zeichen = '/';

                    for (int i = 0; i < satz.Length; i++)
                    {
                        if (zeichen == satz[i])
                            zaehler++;
                    }
                }

                // Reader und Command schließen
                dr.Close();
                con.Close();
            }


So wie ich das im Moment habe, wird die Treeview erzeugt und jeder URL, also auch diejenigen der Unterseiten als Oberknoten dargestellt. Mit dem Schleifenindex i kann ich die Anzahl der Oberknoten bestimmen. Im Moment wäre also ein Oberknoten vorhanden, den man aufklappen kann. Es wird aber noch in jeden Oberknoten jede vorhandene Seite als Unterknoten geschrieben. Mit dem Index j kann ich angeben, wie oft die Unterpunkte jeweils angezeigt werden. Im Moment wird also jeder Unterpunkt einmal angezeigt.

Ich weiss nicht so recht weiter, wie das anstelle, dass z.B. ein 'client/asdf-testseite' als Unterpunkte sowas wie 'client/asdf-testseite/asdf-test-unterseite' hat.

Ich arbeite mit dem Visual Studio 2005.
Hoffentlich hab ich keine relevante Info vergessen und mich verständlich ausgedrückt.

Ich würd mich echt freuen, wenn mir jemand etwas unter die Arme greifen könnte =)

Vielen Dank schonmal und Grüße
v:x
 
Ich bin mir jetzt nicht so ganz sicher welche .net Sprache das eigentlich ist. Ich hab so etwas in der Art mal mit Java gemacht. Wäre toll wenn du beschrieben könntest wie die Daten in der Datenbank gespeichert sind.

Wenn du mit Treeviews arbeitest kommst du eigentlich fast nie um Rekursion herum. Ich vermiss aber in denem code jeden rekursiven Ansatz.

Wenn du allerdings maximal 3 ebenen oder so zulassen möchtest gehts auch ohne. Ist dann aber nicht so schön flexibel.
 
Argh hab ich doch glatt vergessen welche Sprache! Ist C# :)

Hmm wie die Daten gespeichert sind... Also SharePoint legt sich bei der Installation mehrere Datenbanken an. In der Content DB gibt es die Tabelle dbo.Webs in der mehrere Dutzend Spalten sind, unter anderem die Spalte FullUrl, FirstUniqueAncestorWebID und diverse andere IDs. Die FullUrl Spalte enthält dann URLs wie z.B. client/asdf_testseite usw.
Hattest du das in etwa gemeint?

Also mir würde schon reichen wenn ich Oberknoten hätte, die ich aufklappen kann um ein paar Unterknoten zu sehen. Die Unterknoten müssen nicht noch weiter aufklappbar sein.
Wären dann also zwei Ebenen.

//-------------------------------------------------------------------------

So, folgender neuer Stand:
Ich hab in der while-Schleife ne If-Verzweigung gesetzt:

Code:
while (dr.Read())
                {
                    if (CountChar(dr["FullUrl"].ToString()) <= 1)
                    {
                        TreeNode tn = new TreeNode();
                        tn.Text = (dr["FullUrl"].ToString());
                        tn.NavigateUrl = "http://w2003stdtestbdi/" + dr["FullUrl"].ToString();
                        tr.Nodes.Add(tn);
                        tn.Collapse();
                    }
                    else if (CountChar(dr["FullUrl"].ToString()) > 1)
                    {
                        TreeNode tcn = new TreeNode();
                        tcn.Text = (dr["FullUrl"].ToString());
                        tcn.NavigateUrl = "http://w2003stdtestbdi/" + dr["FullUrl"].ToString();
                        tr.Nodes[0].ChildNodes.Add(tcn);
                    }
                }

CountChar ist ne Funktion, die die Slashes in einem Datensatz zählt. Ein Slash ist also ein Oberknoten, alles was mehr als ein Slash hat soll Unterknoten sein. Jetzt werden aber sämtliche Unterknoten unter den ersten Oberknoten gepackt. Das sieht in etwa so aus:

asdf_testseite
-- asdf_test_unterseite
-- qwer_test_unterseite
-- yxcv_test_unterseite
qwer_testseite
yxcv_testseite

Hat jemand ne Idee, wie ich meine Unterknoten den richtigen Oberknoten zuweisen kann? Dazu muss ich ja den richtigen Index in "tr.Nodes[0].ChildNodes.Add(tcn); " haben.
?(

//-------------------------------------------------------------------------

So habs hinbekommen =)
War ganz einfach, ich hab ne int-Variable deklariert die im ersten if-Zweig hochgezählt wird. Im zweiten if-Zweig dient sie dann als Index. Bedeutet, dass nach dem erzeugen von Oberknoten der Index auf diesen Oberknoten zeigt und wenn dann ein Unterknoten kommt wird der automatisch dem richtigen Oberknoten hinzugefügt.

Ha! Tut gut es dann doch alleine geschafft zu haben :D
 
Zurück
Oben