数据库结构
--层次结构
create table Area
(
AreaId int primary key identity(1,1),
AreaName varchar(50),
AreaPId int --父级主Id
)
数据库大概信息
实体类
public class Area
{
public int AreaId { get; set; }
public string AreaName { get; set; }
public int AreaPId { get; set; }
}
WinFrom TreeView控件与集合无限级菜单
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
List<Area> list = new List<Area>();
string constr = "数据库连接串";
using(SqlConnection con = new SqlConnection(constr))
{
string sql = "select * from Area";
using(SqlCommand cmd = new SqlCommand(sql, con))
{
con.Open();
using(SqlDataReader dr = cmd.ExecuteReader())
{
if (dr.HasRows)
{
while (dr.Read())
{
Area area = new Area();
area.AreaId = dr.IsDBNull(0) ? 0 : dr.GetInt32(0);
area.AreaName = dr.IsDBNull(1) ? null : dr.GetString(1);
area.AreaPId = dr.IsDBNull(2) ? 0 : dr.GetInt32(2);
list.Add(area);
}
}
}
}
}
LoadTreeView(treeView1.Nodes, list);
}
//先加载一级菜单
private void LoadTreeView(TreeNodeCollection node,List<Area> list)
{
List<Area> arealist = list.Where(e => e.AreaPId == 0).ToList();
foreach(Area area in arealist)
{
TreeNode node2 = new TreeNode();
node2.Text =area.AreaName;
if (list.Where(e => e.AreaPId == area.AreaId).ToList().Count > 0)
{
LoadTreeView(node2, list, area.AreaId);
}
node.Add(node2);
}
}
//然后加载所有的子菜单
private void LoadTreeView(TreeNode node, List<Area> list,int AreaPId)
{
List<Area> areas = list.Where(e => e.AreaPId == AreaPId).ToList();
if(areas.Count != 0)
{
foreach (Area area in areas)
{
TreeNode node2 = new TreeNode();
node2.Text = area.AreaName;
if (list.Where(e => e.AreaPId == area.AreaId).ToList().Count > 0)
{
LoadTreeView(node2, list, area.AreaId);
}
node.Nodes.Add(node2);
}
}
}
}