Erf on se reverra pas sur le web avant Lundi car Week end oblige ... femme vouloir moi et moi être gentil. je vais deja etudier ce que tu as fait pour bien tout comprendre
Version imprimable
Erf on se reverra pas sur le web avant Lundi car Week end oblige ... femme vouloir moi et moi être gentil. je vais deja etudier ce que tu as fait pour bien tout comprendre
Toi gentil de rester avec femme a toi.
Bon apprivoisement de Linq.
Fait signe dès que tu est dispo pour travailler la récursivité. Je passe ici au moin 40 fois par jour ( la semaine ) donc je devrait pouvoir répondre.
Bon j'ai fait tout ce que tu as dis.
Mais je dois specifier quelque chose sinon ca va pas faire ce que je veux. Je vais eclaircir le resultat voulu.
En fait j'ai une table content les infos suivate Charge d'affaire / Chantier /N° contrat / Libelle contrat
je fais un premier tri sur Chargé d'affaire via ma comboboite car si je fait un triview sur la totalité et que je fais mon expand All ca va faire un sacre arbre.
donc je trie via un dataview et je renvoie dans une nouvelle datatable trié par le CA selectionné par la combobox
Donc j'ai un niveau en moin
donc le resultat voulu
Chantier A
|
-- N° Contrat1 & libelle1
|
-- N° Contrat2 & libelle2
Chantier B
|
-- N° Contrat144 & libelle144
|
-- N° Contrat225 & libelle225
donc faut que je concatène les deux derniers champ
sinon je decortique pour comprendre le langage Linq
Juste pour votre apprentissage, j'ai vite fait une solution avec DataView.ToTable :
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 Public Class Form1 Dim dt As DataTable Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load dt = New DataTable dt.Columns.Add("MaColonne1") dt.Columns.Add("MaColonne2") dt.Columns.Add("MaColonne3") dt.Rows.Add(New String() {"1", "2", "5"}) dt.Rows.Add(New String() {"1", "2", "2"}) dt.Rows.Add(New String() {"1", "3", "2"}) dt.Rows.Add(New String() {"2", "1", "1"}) dt.Rows.Add(New String() {"3", "2", "3"}) dt.Rows.Add(New String() {"3", "3", "2"}) dt.Rows.Add(New String() {"4", "1", "1"}) Dim tableCol1 As DataTable = dt.DefaultView.ToTable(True, New String() {"MaColonne1"}) ComboBox1.DataSource = tableCol1 ComboBox1.DisplayMember = "MaColonne1" ComboBox1.ValueMember = "MaColonne1" ComboBox1.SelectedIndex = 0 End Sub Private Sub ComboBox1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged TreeView1.Nodes.Clear() dt.DefaultView.RowFilter = "MaColonne1 = '" & ComboBox1.Text & "'" Dim tableCol2 As DataTable = dt.DefaultView.ToTable(True, New String() {"MaColonne2"}) For Each row2 As DataRow In tableCol2.Rows Dim nodeNiv1 As TreeNode = TreeView1.Nodes.Add(row2("MaColonne2")) Dim view3 As New DataView(dt) view3.RowFilter = "MaColonne1 = '" & ComboBox1.Text & "' and MaColonne2 = '" & row2("MaColonne2") & "'" Dim tableCol3 As DataTable = view3.ToTable(True, New String() {"MaColonne3"}) For Each row3 As DataRow In tableCol3.Rows nodeNiv1.Nodes.Add(row3("MaColonne3")) Next Next End Sub End Class
En effet, c'Est cool.
J'aurais pas penser de le faire comme ca.
C'est moin compliqué à comprendre que la récursivité pour quelqu'un qui commence je crois. C'est surtout plus simple de garder le contrôle.
Car je vais dire comme mon premier prof d'info ma dit : Pour se lancer dans la récursivité, faut avoir la Foi :aie:
Disons que la récursivité est excellente pour certains problèmes.
Dans un projet de fin d'année j'ai du la maîtriser pour faire une "intelligence artificielle" de résolution de jeux de dame avec l'algorithme alpha/beta (D'ailleurs j'avais modifié la page wikipédia qui contenait une erreur ^^).
Après ce projet je ne pensais plus qu'en récursivité. Résultat, je me suis largement compliqué la vie dans mon premier petit projet au boulot en voulant appliquer la récursivité alors qu'une seul boucle suffisait. il est 10 fois plus compliqué à comprendre.
Donc bien faire attention de ne pas en abuser.
Mais attention, dans certain cas elle simplifie grandement le code aussi...
Je conseillerais à Ashireon de bien maîtriser les bases avant de vouloir se lancer là dedans. Quand tu sera près, fait toi un projet simpa, comme le jeux de dame, c'est pas trop compliqué, c'est sympa pour bien comprendre le récursif et il y a plein d'exemple sur le net.
:pc:
Bon je suis de retour de Week End
J'aimerai donc concatener 2 colonnes de mon datatable? qui seront au final la colonne du node enfant.
Y a t'il une instruction en Linq ou dois je le faire en vb avec un for each ?
Merci
Bon je ne me suis pas cassé la tete j'ai cree une colonne calculé dans ma base d'origine. donc j'ai ma colonne deja formatée pour les nodes enfants et ma colonne pour les nodes parents
Bon voila ou j'en suis
j'ai réussi a générer un treview avec uniquement tous les noeuds parents selon la selection du combobox
je voudrais a présent insérer les nœuds enfant selon les requêtes que saintelaitlait à faite est ce possible ?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 Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged Dim Nme As String = Convert.ToString(ComboBox1.SelectedItem.ToString.Substring(0, 3)) 'récupération des initiales Dim Dtview1 As New DataView Dim tbl01 As New DataTable Dim x As Integer TreeView1.Nodes.Clear() With Dtview1 .Table = DBGMAODataSet.Tables("contrat") .RowFilter = "[Chargé d'affaires] ='" & Nme & "'" .Sort = "Chantier,N° contrat ASC" End With tbl01 = Dtview1.ToTable X = tbl01.Rows.Count - 1 Dim Tab(X) As String For a As Integer = 0 To X Tab(a) = tbl01.Rows(a).Item(1).ToString Next Dim lg1 As Integer = Tab.Length Dim requete3 = Tab.Distinct() Dim z As Integer = requete3.Count For y As Integer = 0 To z - 1 TreeView1.Nodes.Add(New TreeNode(requete3(y))) Next Dim query = From row In tbl01.AsEnumerable _ Group By Parent = row.Field(Of String)("Chantier"), child = row.Field(Of String)("N°libellé") Into count = Count() Dim nodeList As New List(Of node) For Each ret In query nodeList.Add(New node(ret.child, ret.Parent)) Next TreeView1.Sort() TreeView1.ExpandAll() End Sub
Bon je suis arrivé par mes moyens et avec tous vos conseill les tutos le net etc..
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 Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged Dim Nme As String = Convert.ToString(ComboBox1.SelectedItem.ToString.Substring(0, 3)) 'récupération des initiales Dim Dtview1 As New DataView Dim tbl01 As New DataTable Dim x As Integer TreeView1.Nodes.Clear() With Dtview1 .Table = DBGMAODataSet.Tables("contrat") .RowFilter = "[Chargé d'affaires] ='" & Nme & "'" .Sort = "Chantier,N° contrat ASC" End With tbl01 = Dtview1.ToTable X = tbl01.Rows.Count - 1 Dim Tab(X) As String For a As Integer = 0 To X Tab(a) = tbl01.Rows(a).Item(1).ToString Next Dim requete3 = Tab.Distinct() Dim z As Integer = requete3.Count For y As Integer = 0 To z - 1 TreeView1.Nodes.Add(New TreeNode(requete3(y))) Dim tablex As New DataTable Dim dtvi2 As New DataView Dim str01 As String = Convert.ToString(requete3(y)) With dtvi2 .Table = tbl01 .RowFilter = "[Chantier]='" & str01 & "'" End With tablex = dtvi2.ToTable Dim xx As Integer = tablex.Rows.Count - 1 For zz As Integer = 0 To xx TreeView1.Nodes(y).Nodes.Add(tablex.Rows(zz).Item(5)) Next Next TreeView1.Sort() TreeView1.ExpandAll() End Sub
Certes ça l'air d'être lourd pour des pros mais en tous ca cela marche.
Sauf que j'ai une erreur mais je fait un autre post pour cela.
L'erreur n'est pas systématique c'est un plantage car j'ai un quote parfois dans mes strings ' ce que n'aime pas vb apparement
Salut,
Tant mieux si ca fonctionne.
Juste un petit conseil,
Avant de commencer à ajouter des nodes, fait un treeView.beginUpdate() et un .endUpdate() quand tu as fini.
Ceci suspend le rafraichissement du dessin de l'arborescence. Donc ca devrait être plus rapide.
Perso, sur un treeview de 6 voir 7000 mille éléments ca paraît énormément.
Bonne chance!
EDIT: 7000 mille ca fait beaucoup, 7000 devrait nous satisfaire :aie:
ok je te remercie du conseil schtroumpf a lunettes :ccool:
sinon ta solution en linq m’intéresse toujours , surtout que je vais étudier un problème d'une arborescence a 7 ou 8 niveau ou j'ai plus de 2000 lignes a trier.
Donc avec linq ca sera certainement plus simple surtout si je comprends la partie finale
Tu n'as qu'a créer une nouvelle discussion sur le forum et on t'expliquera comment aborder ton problème à 7-8 niveaux.