У меня есть элемент управления WinForm TreeView, который отображает отношение «родитель-потомок» CaseNotes (я знаю, что для большинства из вас это ничего не значит, но помогает мне визуализировать ответы).
У меня есть DataTable CaseNotes, который мне нужно отобразить. Parent / Child определяется следующим образом: если строка имеет ParentNoteID, то это childNode этой заметки, в противном случае это rootNode. Это также может быть родительская заметка (но не rootNode), если у другой строки есть идентификатор, такой как ParentNoteID.
Чтобы усложнить (возможно, упростить) вещи, у меня есть ниже работающий (в основном) код, который чередует цвета узлов. Я вручную создал статическую коллекцию для дерева, и она довольно правильно окрашивает их. Теперь мне нужно динамически заполнить узлы из моей таблицы данных.
Поскольку я уже прохожу через древовидное представление узел за узлом, не могу ли я каким-то образом добавить данные в этот процесс? Может быть, мне нужно сначала построить узлы, а затем раскрасить как отдельную подпрограмму, но метод рекурсии все равно будет применяться, правильно?
Допустим, я хочу отобразить CaseNoteID для каждого узла. Это возвращается в DataTable и является уникальным.
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);
}
}
}
EDIT
Мои мысли / попытки до сих пор:
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();
}
Очевидно, это ошибочно. Один это просто отображать ContactDate снова и снова. Конечно, это показывает правильное количество раз, но я хотел бы, чтобы значение ContactDate (которое является столбцом в базе данных и возвращалось в DataTable. Во-вторых, мне нужно добавить логику ChildNode. A if (node.parentNode = node.CaseNoteID) blah...
РЕДАКТИРОВАТЬ 2
Итак, я нашел эту ссылку, здесь , и кажется, что мне нужно поместить DataTable в ArrayList. Это правильно?
РЕДАКТИРОВАТЬ 3
Хорошо, благодаря Серебусу, это в основном работает. У меня просто есть еще один вопрос. Как мне это принять ->
DataTable cNotesForTree = CurrentCaseNote.GetAllCNotes(Program._CurrentPerson.PersonID);
и использовать мою возвращенную таблицу данных в этом? Должен ли я просто заменить это ->
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" });
Мое замешательство, я думаю, мне все еще нужно делать Column.Add и Row.Adds? Кроме того, как DataColumn перевести на мою реальную структуру данных? Извините за очень невежественные вопросы, хорошая новость в том, что мне никогда не придется спрашивать дважды.
РЕДАКТИРОВАТЬ 4
Ниже приведена ошибка во время выполнения.
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);
}
Ошибка выглядит следующим образом -> Не удается найти столбец [ea8428e4] Это первые 8 цифр правильного NoteID (я должен использовать Guid). Должен ли он искать столбец с таким именем? Поскольку я использую Guid, есть ли что-то еще, что мне нужно сделать? Я изменил все ссылки в моем и ваш код на Guid ...