Remplir WinForms TreeView à partir de DataTable

J'ai un WinForm Contrôle TreeView qui affiche la relation de Parent-Enfant de CaseNotes(je sais que ça ne signifie rien pour la plupart d'entre vous, mais il m'aide à visualiser les réponses).

J'ai un DataTable de la CaseNotes que j'ai besoin d'afficher. Le Parent/Enfant est défini comme suit: Si la ligne a une ParentNoteID alors c'est un childNode de cette note, sinon, c'est un rootNode. Il pourrait également être un parent note(mais pas un rootNode) si une autre ligne a c'est l'ID que c'est ParentNoteID.

Compliquer(peut-être simplifier) les choses que j'ai le dessous de travail(pour la plupart) code de couleurs les nœuds en alternance. J'ai créé manuellement un statique de la collection pour le treeview et les couleurs assez correctement. Maintenant j'ai besoin de remplir dynamiquement les Nœuds de ma DataTable.

Depuis que je suis déjà passer par le treeview de nœud en nœud ne devrais-je pas être en mesure d'ajouter les données dans ce processus en quelque sorte? Peut-être que j'ai besoin de construire les nœuds d'abord et puis la couleur comme une autre routine, mais la récurrence de la Méthode s'appliquent toujours, correct?

Permet de dire que je veux afficher CaseNoteID pour chaque Nœud. Qui est retourné dans la DataTable et est unique.

foreach (TreeNode rootNode in tvwCaseNotes.Nodes)
        {
            ColorNodes(rootNode, Color.MediumVioletRed, Color.DodgerBlue);

        }
protected void ColorNodes(TreeNode root, Color firstColor, Color secondColor)
    {
        root.ForeColor = root.Index % 2 == 0 ? firstColor : secondColor;

        foreach (TreeNode childNode in root.Nodes)
        {
            Color nextColor = childNode.ForeColor = childNode.Index % 2 == 0 ? firstColor : secondColor;

            if (childNode.Nodes.Count > 0)
            {
                //alternate colors for the next node
                if (nextColor == firstColor)
                    ColorNodes(childNode, secondColor, firstColor);
                else
                    ColorNodes(childNode, firstColor, secondColor);
            }
        }
    }

MODIFIER

Mes pensées/tentatives de la mesure:

        public void BuildSummaryView()
    {
        tvwCaseNotes.Nodes.Clear();

        DataTable cNotesForTree = CurrentCaseNote.GetAllCNotes(Program._CurrentPerson.PersonID);
        foreach (var cNote in cNotesForTree.Rows)
        {

            tvwCaseNotes.Nodes.Add(new TreeNode("ContactDate"));
        }
        FormPaint();
    }

Ce n'est évidemment erronée. Un, il suffit d'afficher la ContactDate plus et plus. Accordée il montre le bon nombre de fois, mais je voudrais que la Valeur de ContactDate(qui est une Colonne dans la base de données et est retourné dans la DataTable. La deuxième j'ai besoin d'ajouter de la ChildNode Logique. Un if (node.parentNode = node.CaseNoteID) blah...

EDIT 2

J'ai donc trouvé ce lien, iciet il donne l'impression que je dois obtenir ma DataTable dans une ArrayList. Est-ce exact?

MODIFIER 3

Ok, merci pour Cerebus c'est la plupart du temps de travail. J'ai juste une question de plus. Comment dois-je prendre ce-->

DataTable cNotesForTree = CurrentCaseNote.GetAllCNotes(Program._CurrentPerson.PersonID);

et utiliser ma DataTable retournés dans tout cela? Dois-je remplacer ce -->

    dt = new DataTable("CaseNotes");
dt.Columns.Add("NoteID", typeof(string));
dt.Columns.Add("NoteName", typeof(string));
DataColumn dc = new DataColumn("ParentNoteID", typeof(string));
dc.AllowDBNull = true;
dt.Columns.Add(dc);

//Add sample data.
dt.Rows.Add(new string[] { "1", "One", null });
dt.Rows.Add(new string[] { "2", "Two", "1" });
dt.Rows.Add(new string[] { "3", "Three", "2" });
dt.Rows.Add(new string[] { "4", "Four", null });
dt.Rows.Add(new string[] { "5", "Five", "4" });
dt.Rows.Add(new string[] { "6", "Six", null });
dt.Rows.Add(new string[] { "7", "Seven", null });
dt.Rows.Add(new string[] { "8", "Eight", "7" });
dt.Rows.Add(new string[] { "9", "Nine", "8" });

Ma confusion, je pense, est-ce que je dois faire la Colonne.Ajouter et Ligne.Ajoute? Aussi comment le DataColumn traduire à ma vraie structure de données? Désolé pour la très ignorants des questions, la bonne nouvelle est que je n'ai jamais besoin de demander deux fois.

EDITION 4

Le suivant fournit une erreur d'exécution.

if (nodeList.Find(FindNode) == null)
  {
    DataRow[] childRows = dt.Select("ParentNoteID = " + dr["NoteID"]);
    if (childRows.Length > 0)
    {
      //Recursively call this function for all childRowsl
      TreeNode[] childNodes = RecurseRows(childRows);

      //Add all childnodes to this node.
      node.Nodes.AddRange(childNodes);
    }

    //Mark this noteID as dirty (already added).
    //doneNotes.Add(noteID);
    nodeList.Add(node);
  }

L'erreur est la suivante --> Ne trouve pas la colonne [ea8428e4] Qui est les 8 premiers chiffres de la bonne NoteID(j'ai utiliser un Guid). Devrait-il être à la recherche d'une colonne de ce nom?? Parce que je suis à l'aide d'un Guid est-il autre chose que je dois faire? J'ai changé toutes les références à la mienne et de votre code Guid...

source d'informationauteur Refracted Paladin