Red3
Messages postés3Date d'inscriptionsamedi 16 juillet 2011StatutMembreDernière intervention16 août 2011
-
13 août 2011 à 14:33
Red3
Messages postés3Date d'inscriptionsamedi 16 juillet 2011StatutMembreDernière intervention16 août 2011
-
16 août 2011 à 22:18
Bonjour à tous,
Je tente aussi ma chance ici pour exposer un problème sur lequel je bloque depuis quelques jours : il s'agit du peuplement d'un TreeView depuis une DataTable, contenant le résultat d'une requête effectuée sur une base de données SQL.
Le résultat de la requête (et donc le contenu de la DataTable) se présente ainsi :
Je voudrais afficher tout ça dans un TreeView, et donc obtenir cela :
Malheureusement, tout ce que je parviens à obtenir, c'est cela :
Je ne parviens pas à me débarrasser de la redondance des noeuds (le TreeView réplique le résultat de la requête), y aurait-il une solution pour peupler convenablement ce contrôle ?
Voici le bout de code de départ que j'ai rédigé :
private void Form1_Load(object sender, EventArgs e)
{
// Connexion à la base de données
SqlConnection maConnexion = new SqlConnection("Data Source=(local);Initial Catalog=maBase;Integrated Security=True");
maConnexion.Open();
SqlDataAdapter monAdapter = new SqlDataAdapter();
monAdapter.SelectCommand new SqlCommand("SELECT NOMPROJET, CONSTITUER.CYCLEVIE, NOMLOT, IDINTERV FROM PROJET JOIN CONSTITUER ON PROJET.CODEPROJET CONSTITUER.CODEPROJET AND PROJET.CODEPROJET = 3 LEFT JOIN LOT ON PROJET.CODEPROJET = LOT.CODEPROJET AND LOT.CYCLEVIE = CONSTITUER.CYCLEVIE AND PROJET.CODEPROJET = 3 LEFT JOIN INTERVENTION ON INTERVENTION.CODEPROJET = PROJET.CODEPROJET AND LOT.IDLOT = INTERVENTION.IDLOT AND PROJET.CODEPROJET = 3", maConnexion);
// Importation du résultat de la requête dans la DataTable
DataTable maTable = new DataTable();
monAdapter.Fill(maTable);
maConnexion.Close();
// Début du traitement du TreeView et création du noeud racine
treeView.BeginUpdate();
treeView.Nodes.Clear();
DataRow maRow = maTable.Rows[0];
TreeNode nodeProjet = new TreeNode(maRow["NOMPROJET"].ToString());
treeView.Nodes.Add(nodeProjet);
// Début des problèmes...
Int32 n = 0;
foreach (DataRow dr in maTable.Rows)
{
treeView.Nodes[0].Nodes.Add(dr[1].ToString());
if (dr[2].ToString() != "")
{
treeView.Nodes[0].Nodes[n].Nodes.Add(dr[2].ToString());
}
if (dr[3].ToString() != "")
{
treeView.Nodes[0].Nodes[n].Nodes[0].Nodes.Add(dr[3].ToString());
}
n++;
}
treeView.EndUpdate();
treeView.ExpandAll();
}
Red3
Messages postés3Date d'inscriptionsamedi 16 juillet 2011StatutMembreDernière intervention16 août 2011 13 août 2011 à 16:36
Ok, j'ai trouvé une solution (j'ai adapté un bout de code récupéré sur le net, prévu à l'origine pour afficher une arborescence de dossiers/fichiers dans un TreeView).
Si ça peut servir à quelqu'un :
private void Form1_Load(object sender, EventArgs e)
{
SqlConnection maConnexion = new SqlConnection("Data Source=(local);Initial Catalog=BASE;Integrated Security=True");
maConnexion.Open();
SqlDataAdapter monAdapter = new SqlDataAdapter();
monAdapter.SelectCommand new SqlCommand("SELECT NOMPROJET AS PROJET, CONSTITUER.CYCLEVIE AS ETAPE, NOMLOT AS LOT, IDINTERV AS 'NUMERO INTERVENTION' FROM PROJET JOIN CONSTITUER ON PROJET.CODEPROJET CONSTITUER.CODEPROJET AND PROJET.CODEPROJET = @codeprojet LEFT JOIN LOT ON PROJET.CODEPROJET = LOT.CODEPROJET AND LOT.CYCLEVIE = CONSTITUER.CYCLEVIE AND PROJET.CODEPROJET = @codeprojet LEFT JOIN INTERVENTION ON INTERVENTION.CODEPROJET = PROJET.CODEPROJET AND LOT.IDLOT = INTERVENTION.IDLOT AND PROJET.CODEPROJET = @codeprojet", maConnexion);
monAdapter.SelectCommand.Parameters.Add("@codeprojet", SqlDbType.Int).Value = 3;
monAdapter.Fill(maTable);
maConnexion.Close();
treeView.BeginUpdate();
treeView.Nodes.Clear();
List<string> maListe = new List<string>();
foreach (DataRow dr in maTable.Rows)
{
maListe.Add(dr[0].ToString() + "*" + dr[1].ToString() + "*" + dr[2].ToString() + "*" + dr[3].ToString());
}
// C'est ici que ça commence à être intéressant...
foreach (string monString in maListe)
{
string[] monString2 = monString.Split('*');
TreeNodeCollection LesNodesDuTreeview = treeView.Nodes;
for (Int32 i = 0; i < monString2.Length; i++)
{
Boolean dejaAjoute = false;
foreach (TreeNode NodeCourant in LesNodesDuTreeview)
{
if (NodeCourant.Text.Equals(monString2[i]))
{
dejaAjoute = true;
LesNodesDuTreeview = NodeCourant.Nodes;
continue;
}
}
if (dejaAjoute == false & monString2[i].ToString() != "")
{
TreeNode monNode = new TreeNode(monString2[i]);
LesNodesDuTreeview.Add(monNode);
LesNodesDuTreeview = monNode.Nodes;
}
}
}
treeView.EndUpdate();
treeView.ExpandAll();
}
krimog
Messages postés1860Date d'inscriptionlundi 28 novembre 2005StatutMembreDernière intervention14 février 201549 16 août 2011 à 10:51
Bonjour
Parfait si tu as trouvé toi-même la solution. Merci également de l'avoir mise. En revanche, n'oublie pas de mettre "Réponse acceptée" la prochaine fois, afin qu'on sache que le problème est résolu ;)
Krimog : while (!(succeed = try())) ; - Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -