一般在项目中,为了方便项目后面的开发和管理,菜单都会选择从数据库动态加载。那么,动态加载菜单的原理是什么呢?
我们在数据库建立菜单表的时候,最起码需要有三个字段:菜单ID(ID)、菜单名称(Name)、上级菜单ID(SuperiorID)。
- 查询出所有的菜单数据,循环遍历出上级菜单ID为空的数据,作为一级菜单。
- 把每个一级菜单的菜单ID放到菜单数据里进行比较,得到菜单ID等于上级菜单ID的数据,作为二级菜单。
- 如果后面还有三级、四级菜单,就重复第二步,这个时候我们可以选择用递归的方式来实现。
下面就说一下在代码里面如何操作:
Xaml添加一个Name="SystemMenu"的Menu
<Menu Name="SystemMenu" FontSize="14" Height="25" VerticalAlignment="Top">
</Menu>
CS后台实现:
public MainWindow()
{
InitializeComponent();
LoadSystemMenu();
}
/// <summary>
/// 加载菜单
/// </summary>
public void LoadSystemMenu()
{
//查询出数据库所有的菜单数据
DataTable dataTable = model.GetSystemMenu();
//筛选出上级ID为空的数据(一级菜单)
DataRow[] dataRows = dataTable.Select("SuperiorID is null");
//用来存放一级菜单
List<MenuItem> menuItems = new List<MenuItem>();
foreach (DataRow item in dataRows)
{
MenuItem menu = new MenuItem();
menu.Header = item["Name"].ToString();
menu.RenderSize = new Size(100, 25);
//添加子菜单
AddChildMenu(menu,item["ID"].ToString(), dataTable);
menuItems.Add(menu);
}
//把一级菜单绑定到菜单栏
foreach (MenuItem item in menuItems)
{
this.SystemMenu.Items.Add(item);
}
}
/// <summary>
/// 添加子菜单
/// </summary>
/// <param name="menu"></param>
/// <param name="superiorId"></param>
/// <param name="dataTable"></param>
private void AddChildMenu(MenuItem menu,string superiorId,DataTable dataTable)
{
//筛选出上级菜单ID等于传进来的菜单ID的数据(子菜单)
DataRow[] dataRows = dataTable.Select("SuperiorID =" + superiorId);
foreach (DataRow item in dataRows)
{
MenuItem menuItem = new MenuItem();
menuItem.Header = item["Name"].ToString();
menuItem.RenderSize = new Size(100, 25);
//绑定子菜单
menu.Items.Add(menuItem);
AddChildMenu(menuItem, item["ID"].ToString(), dataTable);
}
}