Avatar billede lasserasch Juniormester
04. oktober 2008 - 22:51 Der er 1 kommentar og
1 løsning

Dynamisk generering af treeview i windows applikation.

Hejsa.

Har et spørgsmål til hvordan jeg kan gribe dette an.

Jeg har en tabel i en SQL database som indeholder en oversigt over websider.

Hver record har f.eks. disse felter (der er flere, men afkortet for at gøre det overskueligt)...

1. Identify ID felt.
2. Navn
3. Parent

Parent er ID'et på den side som skal være forældrer eller overordnet til den pågældende side i mit treeview.

Jeg har så et side objekt til hver side.
Jeg har også en HashTable som indeholder alle sideobjekterne.

Hvis Parent er 0 ville jeg gerne have siden ind i mit treeview som rod. Der kan godt være flere sider med parent = 0.

Mit HashTable er sorteret efter Navn egenskaben for siderne. Dvs. de ligger i alfabetisk rækkefølge i mit hashtable og ikke efter hvilken Parent de har.

Hvis jeg vidste hvor mange niveauer det skulle gå ned var det ikke noget problem, men det ved jeg ikke. Jeg skal på en eller anden måde kunne generere indholdet i et treeview ud fra objekterne i min hashtable.

Jeg skal altså kunne løbe tabellen igennem, og finde alle objekter som har parent = 0.

Hvis et side objekt har parent = 0 skal det altså tilføjes treeviewet. Dette side objekt har så f.eks. id = 5. Jeg skal så også finde alle side objekter i hashtabellen som har parent = 5 og så få disse tilføjet. Et af disse objekter har så f.eks. id = 9. Og igen så skal alle objekter med parent = 9 så tilføjes hertil osv...

Jeg ved bare ikke hvordan jeg kan gøre dette på den bedste og rigtige måde.

Nogle forslag?


Mvh.
Lasse
Avatar billede annxii Nybegynder
05. oktober 2008 - 12:39 #1
Jeg ville trække alle dine sider ud af databasen, lave et TreeNode-object for hver række i dit udtræk og sætte dem ind i et Dictionary (typestærkt hashtable) med Identify ID som key. For at kunne identificere parent ville jeg sende denn med som Tag på hver TreeNode. Hvis du har mere end bare parentID, der skal med rundt kunne du lave en class til at indeholde alt din data for hver node. Ved til sidst at loop'e alle Dictionary's keys igennem kan du pare dem rigtigt.

Sample kode:
SqlCommand cmd = new SqlCommand("SELECT id, navn, parentID FROM Websites;");
Dictionary<int, TreeNode> websites = new Dictionary<int, TreeNode>();

SqlDataReader rdr = cmd.ExecuteReader();

while (rdr.Read())
{
    string navn = rdr["navn"].ToString();
    int id = int.Parse(rdr["id"].ToString());
    int parentID = int.Parse(rdr["parentID"].ToString());

    TreeNode node = new TreeNode(navn);
    node.Tag = parentID;
    websites[id] = node;
}

foreach (int key in websites.Keys)
{
    int parent = int.Parse(websites[key].Tag);

    if (parent > 0)
        websites[parent].Nodes.Add(websites[key]);
    else
        treeView1.Nodes.Add(websites[key]);
}
Avatar billede lasserasch Juniormester
07. oktober 2008 - 01:09 #2
Perfekt. Med lidt modifikationer for at blive tilpasset mine objekter, fungerede denne løsning super godt. Har altid brugt HashTables, men kan da se at jeg skal til at lege med Dictionary objektet i stedet for.

Hold op hvor man også kan spare meget type casting kode...

Tak for hjælpen!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester