我是用的vb语法写的,大体意思一样。
1.如果你不用DataSource,手动定义是这样的:
Dim parntItem, nodeItem as MenuItem
parntItem = new MenuItem("firstMenu","firstMenu") //显示和value,我们一般都设置一样.
nodeItem = new MenuItem("secondMenu","secondMenu") //同上
//把子节点加入父节点
parntItem.ChildItems.Add(nodeItem)
...可以继续这样无限加
最后把这个父节点加入到Menu控件中
Me.menu.Items.Add(parntItem)
2.下面写一个在vb.net中的一个例子:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim ds as DataSet = searchMessage() //调用一个方法得到一个DataSet
Dim dt_type, dt_sub_type As DataTable //创建一个父节点和子节点DataTable
Dim dv As DataView
dv = ds.Tables(0).DefaultView()
dt_type = dv.ToTable(True, "type") //返回只有父节点的DataTable
dt_sub_type = dv.ToTable(True, "type", "subtype") //返回只有父节点和子节点的DataTable
Dim subrow() As DataRow
Dim parntItem, parntItem As MenuItem
For Each oRow As DataRow In dt_type.Rows
parntItem = New MenuItem(oRow("type"), oRow("type"))
subrow = dt_sub_type.Select(String.Format("type='{0}'", oRow.Item("type")))
For i As Integer = 0 To subrow.Length - 1
nodeItem = New MenuItem(subrow(i)("subtype"), subrow(i)("subtype"))
parntItem.ChildItems.Add(nodeItem)
Next
parntItem.Selectable = False //父节点不可以选
Me.menu.Items.Add(parntItem) //加入到Menu控件中
Next
//如果子节点的个数大于0.默认选中
If dt_sub_type.Rows.Count > 0 Then
bindData(dt_sub_type.Rows(0).Item("type"), dt_sub_type.Rows(0).Item("subtype"))
End If
End Sub
Private Sub bindData(ByVal type As String, ByVal sub_type As String)
Dim dv As DataView
dv = ds.Tables(0).DefaultView()
dv.RowFilter = String.Format("type = '{0}' and subtype='{1}'", type, subtype)
//这是给GridView赋值DataSource
gvSearch.DataSource = dv
gvSearch.DataBind()
End Sub
最后把控件的MenuItemClick事件写上
Protected Sub mCategories_MenuItemClick(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.MenuEventArgs) Handles mCategories.MenuItemClick
bindData(e.Item.Parent.Value, e.Item.Value)
//意思是 获得当前你点击的节点的父节点 和 当前节点 给bindData方法,绑定数据源
End Sub