У меня есть элемент управления TreeView WinForm, который отображает отношение родительского ребенка к CaseNotes (я знаю, это ничего не значит для большинства из вас, но это помогает мне визуализировать ответы).
У меня есть DataTable из CaseNotes, который мне нужно отобразить. Родитель/ребенок определяется как: Если строка имеет ParentNoteID, то это дочернийNode этой заметки, иначе это rootNode. Это также может быть родительская нота (но не rootNode), если в другой строке есть идентификатор в виде ParentNoteID.
Чтобы усложнить (возможно, упростить) вещи, у меня есть приведенный ниже рабочий (главным образом) код, который чередует цвета узлов. Я вручную создал статическую коллекцию для древовидной структуры, и она правильно их расписала. Теперь мне нужно динамически заполнять узлы из моего DataTable.
Так как я уже иду через treeview node на node, не должен ли я каким-то образом добавлять данные в этот процесс? Возможно, мне нужно сначала создать узлы, а затем цвет как отдельную процедуру, но метод рекурсии все равно будет применяться, правильно?
Предположим, что я хочу отображать CaseNoteID для каждого Node. Это возвращается в 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);
}
}
}
ИЗМЕНИТЬ
Мои мысли/попытки:
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...
EDIT 2
Итак, я нашел эту ссылку, здесь, и мне кажется, что мне нужно, чтобы моя DataTable попала в ArrayList. Это правильно?
РЕДАКТИРОВАТЬ 3
Хорошо, благодаря Cerebus это в основном работает. У меня есть еще один вопрос. Как это сделать →
DataTable cNotesForTree = CurrentCaseNote.GetAllCNotes(Program._CurrentPerson.PersonID);
и использовать мой возвращенный DataTable в этом? Я просто заменил это →
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 переводится в мою реальную структуру данных? Извините за очень неосведомленные вопросы, хорошие новости - мне никогда не придется спрашивать дважды.
EDIT 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...