J'ai ajouté pour gerer l'erreur
Code:
1
2
3
4 If Not row3(2) Is System.DBNull.Value Then n3 = New TreeNode(row3(2)) n2.Nodes.Add(n3) End If
Version imprimable
J'ai ajouté pour gerer l'erreur
Code:
1
2
3
4 If Not row3(2) Is System.DBNull.Value Then n3 = New TreeNode(row3(2)) n2.Nodes.Add(n3) End If
Exact, j'avais un petit peu triché en enlevant les cases vides dans ton fichier pour tester rapidement :oops:
je n'ai pas encore tester le dernier niveau mais je dois avoir un bug
voir resultat pieces jointesCode:
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44 Dim n0, n1, n2, n3, n4, n5, n6, n7 As TreeNode n0 = New TreeNode(TextBox1.Text) TreeView1.Nodes.Add(n0) For Each row1 As DataRow In DBGMAODataSet.GESTION_EQUIPEMENT.DefaultView.ToTable(True, ("NIVEAU0")).Rows n1 = New TreeNode(row1(0)) n0.Nodes.Add(n1) For Each row2 As DataRow In DBGMAODataSet.GESTION_EQUIPEMENT.DefaultView.ToTable(True, {"NIVEAU0", "NIVEAU1"}).Select("NIVEAU0='" & row1(0) & "'") If Not row2(1) Is System.DBNull.Value Then n2 = New TreeNode(row2(1)) n1.Nodes.Add(n2) End If For Each row3 As DataRow In DBGMAODataSet.GESTION_EQUIPEMENT.DefaultView.ToTable(True, {"NIVEAU0", "NIVEAU1", "NIVEAU2"}).Select("NIVEAU1='" & row2(1) & "' AND NIVEAU0='" & row1(0) & "'") If Not row3(2) Is System.DBNull.Value Then n3 = New TreeNode(row3(2)) n2.Nodes.Add(n3) End If For Each row4 As DataRow In DBGMAODataSet.GESTION_EQUIPEMENT.DefaultView.ToTable(True, {"NIVEAU0", "NIVEAU1", "NIVEAU2", "NIVEAU3"}).Select("NIVEAU2='" & row3(2) & "' AND NIVEAU1='" & row2(1) & "' AND NIVEAU0='" & row1(0) & "'") If Not row4(3) Is System.DBNull.Value Then n4 = New TreeNode(row4(3)) n3.Nodes.Add(n4) End If For Each row5 As DataRow In DBGMAODataSet.GESTION_EQUIPEMENT.DefaultView.ToTable(True, {"NIVEAU0", "NIVEAU1", "NIVEAU2", "NIVEAU3", "NIVEAU4"}).Select("NIVEAU3='" & row4(3) & "' AND NIVEAU2='" & row3(2) & "' AND NIVEAU1='" & row2(1) & "' AND NIVEAU0='" & row1(0) & "'") If Not row5(4) Is System.DBNull.Value Then n5 = New TreeNode(row5(4)) n4.Nodes.Add(n5) End If For Each row6 As DataRow In DBGMAODataSet.GESTION_EQUIPEMENT.DefaultView.ToTable(True, {"NIVEAU0", "NIVEAU1", "NIVEAU2", "NIVEAU3", "NIVEAU4", "NIVEAU5"}).Select("NIVEAU4='" & row5(4) & "' AND NIVEAU3='" & row4(3) & "' AND NIVEAU2='" & row3(2) & "' AND NIVEAU1='" & row2(1) & "' AND NIVEAU0='" & row1(0) & "'") If Not row6(3) Is System.DBNull.Value Then n6 = New TreeNode(row6(3)) n5.Nodes.Add(n6) End If Next Next Next Next Next Next
c'est row6(5) dans ta dernière boucle :p
Copier-coller c'est mal:aie:
Bon j'en suis la j'ai corrigé l'erreur je l'ai vu egalement apres le post cependant j'ai un autre problème
Des doublons se creent a un niveau ( je me demande si ca n'a pas un lien avec l'erreur DBnull que j'ai geré)
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 Dim n0, n1, n2, n3, n4, n5, n6, n7 As TreeNode TreeView1.BeginUpdate() n0 = New TreeNode(TextBox1.Text) TreeView1.Nodes.Add(n0) For Each row1 As DataRow In DBGMAODataSet.GESTION_EQUIPEMENT.DefaultView.ToTable(True, ("NIVEAU0")).Rows n1 = New TreeNode(row1(0)) n0.Nodes.Add(n1) For Each row2 As DataRow In DBGMAODataSet.GESTION_EQUIPEMENT.DefaultView.ToTable(True, {"NIVEAU0", "NIVEAU1"}).Select("NIVEAU0='" & row1(0) & "'") If Not row2(1) Is System.DBNull.Value Then n2 = New TreeNode(row2(1)) n1.Nodes.Add(n2) End If For Each row3 As DataRow In DBGMAODataSet.GESTION_EQUIPEMENT.DefaultView.ToTable(True, {"NIVEAU0", "NIVEAU1", "NIVEAU2"}).Select("NIVEAU1='" & row2(1) & "' AND NIVEAU0='" & row1(0) & "'") If Not row3(2) Is System.DBNull.Value Then n3 = New TreeNode(row3(2)) n2.Nodes.Add(n3) End If For Each row4 As DataRow In DBGMAODataSet.GESTION_EQUIPEMENT.DefaultView.ToTable(True, {"NIVEAU0", "NIVEAU1", "NIVEAU2", "NIVEAU3"}).Select("NIVEAU2='" & row3(2) & "' AND NIVEAU1='" & row2(1) & "' AND NIVEAU0='" & row1(0) & "'") If Not row4(3) Is System.DBNull.Value Then n4 = New TreeNode(row4(3)) n3.Nodes.Add(n4) End If For Each row5 As DataRow In DBGMAODataSet.GESTION_EQUIPEMENT.DefaultView.ToTable(True, {"NIVEAU0", "NIVEAU1", "NIVEAU2", "NIVEAU3", "NIVEAU4"}).Select("NIVEAU3='" & row4(3) & "' AND NIVEAU2='" & row3(2) & "' AND NIVEAU1='" & row2(1) & "' AND NIVEAU0='" & row1(0) & "'") If Not row5(4) Is System.DBNull.Value Then n5 = New TreeNode(row5(4)) n4.Nodes.Add(n5) End If For Each row6 As DataRow In DBGMAODataSet.GESTION_EQUIPEMENT.DefaultView.ToTable(True, {"NIVEAU0", "NIVEAU1", "NIVEAU2", "NIVEAU3", "NIVEAU4", "NIVEAU5"}).Select("NIVEAU4='" & row5(4) & "' AND NIVEAU3='" & row4(3) & "' AND NIVEAU2='" & row3(2) & "' AND NIVEAU1='" & row2(1) & "' AND NIVEAU0='" & row1(0) & "'") If Not row6(5) Is System.DBNull.Value Then n6 = New TreeNode(row6(5)) n5.Nodes.Add(n6) End If 'For Each row7 As DataRow In DBGMAODataSet.GESTION_EQUIPEMENT.DefaultView.ToTable(True, {"NIVEAU0", "NIVEAU1", "NIVEAU2", "NIVEAU3", "NIVEAU4", "NIVEAU5", "NIVEAU6"}).Select("NIVEAU5='" & row6(5) & "' AND NIVEAU4='" & row5(4) & "' AND NIVEAU3='" & row4(3) & "' AND NIVEAU2='" & row3(2) & "' AND NIVEAU1='" & row2(1) & "' AND NIVEAU0='" & row1(0) & "'") 'If Not row7(6) Is System.DBNull.Value Then 'n7 = New TreeNode(row7(6)) ' n6.Nodes.Add(n7) ' End If 'Next Next Next Next Next Next Next TreeView1.EndUpdate() TreeView1.ExpandAll()
J'ai rempli les blancs de la base de données d'origine par une valeur Bidon genre "Non renseigné"
J'ai toujours mes doublons ??
avec l'ensemble de tous les niveaux il me mets presque 10 minutes a faire toute l'arborescence c'est un peut trop long pour traiter 4000 lignes de la base.
Soit je construits une fois l'arborescence et je la stocke mais je ne vois pas comment on peut faire cela.
Le temps de réponse est vraiment exponentiel.
À 6 niveau il se génère en 30-40 seconde. Et à 7 niveaux c'est plusieurs minutes LOL.
Je vais regarder si on peut tweaker un peu pour éviter des boucles.
JE comprend pas pourquoi tu as des doublons.
Il n'y en a pas dans mon arbre.
Ca vien surement du fait que j'ai modifié tes IF mais si tu as remplie les record DbNull de ta BD ca devrait rien changer.
J'Ai englober le code avec des if. Genre que tout ce qui suit un if est imbriqué dans ce if.
Regarde ou les if se ferment maintenant
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 End If Next End If Next End If Next End If Next End If Next Next
Au pire je supprime le dernier niveau ( qui est une extension du precedent dans le sens ou il donne le type de matériel.
JE fait le treeview avec un niveau en moin et le dernier passe en infos quand je clique sur le node dans le form dans une textbox.
je vais coller une progressbar pour identifier le temps de traitement a l'utilisateur
avec l'imbrication des end if j'ai plus de doublons.
Je me doutais que ca ne pouvais venir que de ma partie lol
Et j'Essaie de trouver si on peut cour-circuiter les opérations dans le .select.
Car si tu as
Et qu'on arrive à cour-circuiter sur la comparaison avec row1(0). Tu évite les 5 autres comparaison.Code:
1
2 Select("NIVEAU5 <> '' AND NIVEAU4='" & row5(4) & "' AND NIVEAU3='" & row4(3) & "' AND NIVEAU2='" & row3(2) & "' AND NIVEAU1='" & row2(1) & "' AND NIVEAU0='" & row1(0) & "'")
Donc un gain de performances.
Par cour-circuiter j'entend l'équivalent d'un AndAlso:aie:
Ah merdouille non j'ai encore des doublons
Avec les if retirés?
Si oui remet les ça ne doit pas paraitre énormément sur le temps d'exec
Je viens de rentrer chez moi je vais regarder en enlevant les IF
Sinon t'ai franchement sympa.
Tu es du Quebec? JE demande ma copine y est aller 3 mois l'annéee derniere et elle a adorée
Oui du Québec!
Et j'Ai une bonne nouvelle pour toi!
Depuis hier soir que je travaille sur une méthode récursive de faire le travail, car je n'arrivais pas à me convaincre que c'était bien d'utiliser cette manière!
Et j'Ai abouti.
Bâtir le treeview, au complet jusqu'au dernier niveau = 0,34 seconde :ccool:
Et ca tien sur 20 ligne de code :)
Je peux te filer le code, mais par contre j'ai pas le temps d'expliquer du tout :aie:
suis preneur et je vais essayer de comprendre
si y a un truc que je piges pas je te poserai la question
Tadamm!
Tu call la fonction createTreeView en lui passant ta datatable en paramètre, et tu nomme ton treeview treeview1, ou tu change le code.
Admire la puissance de ces 30 lignes de code :DCode:
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
31
32
33 Private Sub createTreeView(ByRef table As DataTable) For i = 0 To table.Rows.Count - 1 createTreeNode(0, table.Columns.Count - 1, table.Rows(i)) Next End Sub Private Sub createTreeNode(ByVal level As Integer, ByVal maxDepth As Integer, ByRef row As DataRow, Optional ByRef parentNode As TreeNode = Nothing) Dim node As New TreeNode node.Text = row(level) node.Name = row(level) If parentNode IsNot Nothing Then If Not parentNode.Nodes.ContainsKey(row(level)) Then parentNode.Nodes.Add(node) Else node = parentNode.Nodes(row(level).ToString) End If Else If Not TreeView1.Nodes.ContainsKey(row(level)) Then TreeView1.Nodes.Add(node) Else node = TreeView1.Nodes(row(level).ToString) End If End If If maxDepth >= level + 1 Then createTreeNode(level + 1, maxDepth, row, node) End If End Sub