Полагаю, вы знаете, как читать данные из базы данных, поэтому я пропускаю эту часть.
Абстрактная версия - вы можете читать сотрудников из любого источника.
Некоторые вспомогательные сущности (вы можете обойтись без них ofc - использовать этот способ проще / приятнее):
/// <summary>The employee structure with explicit conversion to a TreeNode (you may also use implicit conversion, but i prefer explicit).</summary>
public struct Employee
{
public int Id;
public string Name;
public int BossId;
public static explicit operator TreeNode(Employee e) { return new TreeNode(e.Name); }
}
public static class EmployeesExtension
{
/// <summary>More abstract and readable way to add an employee.</summary>
public static void Add(this Dictionary<int, List<Employee>> employees, int id, string name, int bossId)
{
if (!employees.ContainsKey(bossId)) employees[bossId] = new List<Employee>();
employees[bossId].Add(new Employee() { Id = id, Name = name, BossId = bossId });
}
}
Метод, используемый для заполнения TreeView:
public static void PopulateTreeView(Dictionary<int, List<Employee>> employees, int bossId, TreeNodeCollection nodes)
{
if (!employees.ContainsKey(bossId)) return;
foreach (Employee e in employees[bossId])
{
TreeNode tn = (TreeNode)e;
nodes.Add(tn);
PopulateTreeView(employees, e.Id, tn.Nodes);
}
}
Как использовать его в своем коде:
Dictionary<int, List<Employee>> employees = new Dictionary<int, List<Employee>>();
/* Here you will do the actual reading from DB */
// id, name, bossId
employees.Add(666, "The Master ", 0);
employees.Add(123, "The Underling 1", 666);
employees.Add(879, "The Underling 2", 666);
employees.Add(001, "The Slave 1 ", 123);
this.treeView1.BeginUpdate();
PopulateTreeView(employees, 0, this.treeView1.Nodes);
this.treeView1.EndUpdate();
Использование методов BeginUpdate
/ EndUpdate
устранит «мерцание» вашего графического интерфейса.