Toon posts:

[VB.NET] Treeview van 3 multidimensionale arrays

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een treeview te maken die een overzicht geeft van een database. De database is "plat" opgebouwd. De structuur wil ik als volgt visualiseren:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Projectdeel]
                 |
                 +-[Hoofdgroep1]-+
                 |               |
                 |               +-[Subgroep1]
                 |               +-[Subgroep2]
                 |               +-[Subgroep3]
                 |
                 |
                 +-[Hoofdgroep2]-+
                                 |
                                 +-[Subgroep1]
                                 +-[Subgroep2]
                                 +-[Subgroep3]
Etc.

De tabel is dan weer (niet zozeer voor deze treeview maar voor de rest van mijn programma dat wel al naar behoren werkt, dus wijzigen: liever niet :-)) als volgt opgebouwd:

code:
1
2
3
4
5
6
7
8
9
10
11
12
[Tabel Projectdelen]
Id
Projectdeel
[Tabel Hoofdgroepen]
Id
ProjectdeelId
Hoofdgroep
[Tabel Subgroepen]
Id
ProjectdeelId
HoofdgroepId
Subgroep
De structuur lijkt me opzich eigelijk ideaal om een treeview van te maken. En ik snap dan ook wel hoe ik ongeveer die nodes wil toevoegen. Maar ik loop wegens mijn magere ervaring met Visual Basic tegen technische problemen op.

Allereerst haal ik de data van de database uit de database en zet ik die in een array als volgt:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        ' ---------------------------------------------------------------------

        ' Data ophalen uit tblCalculatieSubgroepen
        Dim tblCalculatieSubgroepenpDbAdapter As OleDbDataAdapter = New OleDbDataAdapter("SELECT Subgroep, Id, HoofdgroepId, ProjectdeelId FROM tblCalculatieSubgroepen", pConnection)
        Dim tblCalculatieSubgroepenpDataset As DataSet = New DataSet

        ' Probeer data op te halen en geef indien fout een foutmelding
        Try
            tblCalculatieSubgroepenpDbAdapter.Fill(tblCalculatieSubgroepenpDataset)
        Catch ex As OleDbException
            MsgBox("Fout: " & ex.Message & "Project Id:" & wizCalculatieId)
            Return
        End Try

        ' Array aanmaken van de Subgroepen
        Dim wizSubgroepenArray(tblCalculatieSubgroepenpDataset.Tables(0).Rows.Count - 1, 3) As String
        For i As Integer = 0 To tblCalculatieSubgroepenpDataset.Tables(0).Rows.Count - 1
            wizSubgroepenArray(i, 0) = tblCalculatieSubgroepenpDataset.Tables(0).Rows(i)("Subgroep")
            wizSubgroepenArray(i, 1) = tblCalculatieSubgroepenpDataset.Tables(0).Rows(i)("ProjectdeelId")
            wizSubgroepenArray(i, 2) = tblCalculatieSubgroepenpDataset.Tables(0).Rows(i)("HoofdgroepId")
            wizSubgroepenArray(i, 3) = tblCalculatieSubgroepenpDataset.Tables(0).Rows(i)("Id")
        Next

        ' ---------------------------------------------------------------------
En dat doe ik dan ook voor Projectdelen en Hoofdgroepen, alleen hebben hun arrays respectievelkijk 2 en 3 dimensies. Dus elke array heeft als eerste dimensie zijn eigen Id, als 2de zijn naam, als 3de de eventueel bovenliggende groep en de 4de ook een eventueel daarboven liggende groep.

Maar nu komt the tricky part in mijn ogen. Al die dingen structureel in die treeview proppen. Zo ver kom ik:

Visual Basic:
1
2
3
4
5
        ' ---------------------------------------------------------------------

        For i As Integer = 0 To wizProjectdelenArray.GetLength(0) - 1
            tviewWizard8Overzicht.Nodes.AddRange(New TreeNode() {New TreeNode(wizProjectdelenArray(i, 0), New TreeNode() {For i2 as Integer = 0 To wizHoofdgroepenArray.GetLength -1  New TreeNode("Hoofdgroep 1", New TreeNode() {New TreeNode("Subgroep 1")}) Next })})
        Next
Maar wat ik nu eigelijk doe is een for loop in een forloop in het toevoegen van een node, enja ALS dat al kan is het heel erg onoverzichtelijk! Kan iemand mij vertellen hoe ik dit beter kan aanpakken? (Ja heb het niet verder geprobeerd af te maken want VS.NET gaf me al aan dat ik fout bezig was).

  • whoami
  • Registratie: December 2000
  • Laatst online: 29-04 13:16
Je kan één query uitvoeren die je over die 3 tabellen laat gaan. Je zorgt ervoor dat de gegevens gesorteerd zijn, zodanig dat alles wat bij elkaar hoort, bij elkaar staat.

Dan ga je één keer over die resultset lopen, en ga je, iedere keer je een 'groepsverandering' hebt in de id's, een bepaalde actie ondernemen.

Bv, zorg ervoor dat je de data zo krijgt:
code:
1
2
3
1, ProjectDeel1, 1, HoofdGroep1, 1 SubGroep1
1, ProjectDeel1, 1, HoofdGroep1, 2 SubGroep2
1, ProjectDeel1, 2, HoofdGroep1_2, 3 SubGroep1


Dan ga je dus over die set lopen, en hou je de id's bij van ieder onderdeel waar je nu mee bezig bent.
Als die id veranderd, ga je een andere node gaan maken:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
int i = 0;
while( i < numberOfItemsInSet )
{

  int currentProjectId = set[i].ProjectId;

   // TODO: creeër hier een nieuwe node voor het project

  while( currentProjectId == set[i].ProjectId && i < numberOfItemsInSet)
  {
       int currentHoofdGroepId = set[i].HoofdGroepId
       // TODO: maak hier een nieuwe node voor je hoofdgroep, en add ze 
       // aan de projectnode die je daarnet gemaakt hebt.
       
       while( currentHoofdGroepId == set[i].HoofdGroepId &&
                currentProjectId == set[i].ProjectId &&
                i < numberOfItemsInSet )
       {
             int currentSubGroepId = set[i].SubGroepId;
             // TODO: maak node voor subgroep, add ze aan de node die je 
             // gemaakt hebt voor de hoofdgroep
             while( currentSubGroepId == set[i].SubGroepId &&
                       currentHoofdGroepId == ....
                       .. .)
             {
                      i++;
             }
       }       
  }  
}


Zoiets zou ongeveer moeten werken. Let wel, dit is pseudo-code.

https://fgheysels.github.io/


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

persoonlijk zou ik het zo aanpakken:

DB:
code:
1
2
3
4
tabel[groepen]
- id
- groepnaam
- parentID (default=-1 voor bovenste level)


en dan denk ik dat het wel simpel(evt. recursief) mogelijk moet zijn om in je treeview de parent node op te zoeken adhv een ID of iets gelijkwaardigs.

wil je dan ook nog eens je groepen verschillende extra kenmerken geven dan kan je in je DB:
code:
1
2
3
4
5
6
7
tabel[hoofdgroepen]
- groepID (ref naar Groepen.ID)
- eigenschappen

tabel[subgroepen]
- groepID
- eigenschappen

ASSUME makes an ASS out of U and ME


  • whoami
  • Registratie: December 2000
  • Laatst online: 29-04 13:16
Da's natuurlijk een mogelijkheid, maar dan moetde TS wel z'n datamodel aanpassen...

https://fgheysels.github.io/