Создайте новый класс для представления записей вашей базы данных:
Я использовал соглашение об именовании из метода Add для TreeNodeCollection, где Key - это значение узла, а Text - метка узла, потому что вы еще не дали понять, как на самом деле называются столбцы в вашей таблице или типы они есть. Было бы полезно добавить эту информацию в вопрос.
public class TreeNodeRecord
{
public string Key { get; set; }
public string ParentKey { get; set; }
public string Text { get; set; }
}
Обычно ключ - это значение первичного ключа (обычно называемое идентификатором) из базы данных. ParentKey будет значением первичного ключа родительского узла (обычно хранится в столбце, называемом чем-то вроде ParentId). Ваш код, кажется, связывает узлы таким образом, что является наиболее распространенной реализацией хранения дерева в базе данных.
Так, например:
- TreeNodeRecord, где Key = 1 и ParentKey = 0 - корневой узел
- TreeNodeRecord, где Key = 2 и ParentKey = 1 - дочерний элемент корневого узла.
Создайте класс для инкапсуляции методов заполнения дерева с узлами из вашей базы данных:
public static class TreeBuilder
{
public static void BuildTree(TreeView treeview)
{
// Load database records into strongly typed list
List<TreeNodeRecord> records = GetTreeNodeRecords();
//Pause redrawing for the tree view control
treeview.BeginUpdate();
// Recursively add all items in the list to the tree
AddNodes(records, "0", treeview.Nodes);
// Resume redrawing for the tree view control
treeview.EndUpdate();
}
// A method that reads all of the database records, and returns a strongly typed list for further processing
private static List<TreeNodeRecord> GetTreeNodeRecords()
{
List<TreeNodeRecord> records = new List<TreeNodeRecord>();
string MyConString = ConfigurationManager.ConnectionStrings["College_Management_System.Properties.Settings.cmsConnectionString"].ConnectionString;
using (MySqlConnection connection = new MySqlConnection(MyConString))
{
connection.Open();
using (MySqlCommand command = connection.CreateCommand())
{
MySqlDataReader reader;
command.CommandText = "select * from menu_details";
using (reader = command.ExecuteReader())
{
while (reader.Read())
{
TreeNodeRecord newRecord = new TreeNodeRecord
{
Key = reader[3].ToString(),
ParentKey = reader[2].ToString(),
Name = reader[1].ToString()
};
records.Add(newRecord);
}
}
}
}
return records;
}
// A recursive method to add nodes to the tree
private static void AddNodes(List<TreeNodeRecord> records, string parentKey, TreeNodeCollection nodes)
{
List<TreeNodeRecord> children = records.Where(r => r.ParentKey == parentKey).ToList();
foreach (TreeNodeRecord child in children)
{
TreeNode newNode = nodes.Add(child.Key, child.Text);
AddNodes(records, child.Key, newNode.Nodes);
}
}
}
Используйте класс для заполнения элемента управления TreeView:
TreeBuilder.BuildTree(treeView1);
Обратите внимание, важно правильно утилизировать ваши предметы. Если используемый вами объект реализует IDisposable (имеет метод Dispose ()), вы должны вызвать Dispose (), когда закончите с ним. Приведенный выше код достигает этого, заключая объекты в операторы using, что обеспечивает вызов Dispose () даже в случае возникновения каких-либо исключений.