Menu 是另一个支持层次化数据的富控件。它可以绑定到数据源(声明性的)或编程使用 MenuItem 对象来填充。
MenuItem 类不像 TreeNode 类那样丰富,它不支持复选框,也不能通过编程设置它们的 折叠/展开 状态。不过,它们也有很多相似的属性,包括那些用于设置图片、确定条目是否可选以及指定目标链接的属性。
MenuItem 的属性:
| Text | 菜单中显示的文字 |
| TooTip | 鼠标停留菜单项时的提示文字 |
| Value | 保存不显示的额外数据(比如某些程序需要用到的 ID) |
| NavigateUrl | 如果设置了值,单击节点会前进至此 Url。否则,需要响应 Menu.MenuItemClick事件确定要执行的活动 |
| Target | 它设置了链接的目标窗口或框架。Menu 自身也暴露了 Target 属性设置所有的 MenuItem 实例的默认目标 |
| Selectable | 如果为 false,菜单项不可选。通常只在菜单项有一些可选的子菜单项时,才设为 false |
| ImageUrl | 菜单项旁边的图片 |
| PopOutImageUrl | 菜单项包含子项时现在在菜单项旁的图片,默认是一个小的实心箭头 |
| SeparatorImageUrl | 菜单项下面显示的图片,用于分隔菜单项 |
和遍历 TreeView 结构的方式相同,Menu 控件仅做很小的改动,几乎就可以重用先前 TreeView 的代码:
object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
DataSet ds = GetProductsAndCategories();
foreach (DataRow row in ds.Tables["Categories"].Rows)
{
MenuItem itemCategory = new MenuItem(
row["CategoryName"].ToString(),
row["CategoryID"].ToString());
Menu1.Items.Add(itemCategory);
DataRow[] childRows = row.GetChildRows(ds.Relations["CatProds"]);
foreach (DataRow childRow in childRows)
{
MenuItem itemProduct = new MenuItem(
childRow["ProductName"].ToString(),
childRow["ProductID"].ToString());
itemCategory.ChildItems.Add(itemProduct);
}
}
}
}
protected void Menu1_MenuItemClick(object sender, MenuEventArgs e)
{
if (Menu1.SelectedItem.Depth == 0)
{
lblInfo.Text = "You selected Category ID: ";
}
else if (Menu1.SelectedItem.Depth == 1)
{
lblInfo.Text = "You selected Product ID: ";
}
lblInfo.Text += Menu1.SelectedItem.Value;
}