65.9K
CodeProject 正在变化。 阅读更多。
Home

动态菜单绑定

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.80/5 (2投票s)

2013 年 10 月 11 日

CPOL
viewsIcon

13859

大家好…… 很多人都在尝试或致力于动态绑定菜单。我这里有一个解决方案,我将提供示例代码来

大家好。

很多人都在尝试或致力于动态绑定菜单。我有一个解决方案。

这里,我将提供示例代码来动态创建菜单。

MenuTest.aspx

<asp:Menu ID="Menu1" runat="server" Orientation="Horizontal">
</asp:Menu>  

MenuTest.aspx.cs  

static string constr = "SQLOLEDB;Data Source=ABC;Integrated Security=SSPI;Initial Catalog=XYZ";
OleDbConnection cn = new OleDbConnection(constr);  

protected void Page_Load(object sender, EventArgs e)
{
  if (!Page.IsPostBack)
    PopulateRootLevel();
}  

private void PopulateRootLevel()
{
  OleDbCommand objCommand = new OleDbCommand(@"select id,title,(select count(*) FROM SampleCategories WHERE parentid=sc.id) childnodecount FROM SampleCategories sc where parentID IS NULL", cn);
  OleDbDataAdapter da = new OleDbDataAdapter(objCommand);
  DataTable dt = new DataTable();
  da.Fill(dt);
  PopulateNodes(dt, Menu1.Items);
}

private void PopulateSubLevel(int parentid, MenuItem parentMenu)
{
  OleDbCommand objCommand = new OleDbCommand(@"select id,title,(select count(*) FROM SampleCategories WHERE parentid=sc.id) childnodecount FROM SampleCategories sc where parentID="+parentid+"", cn);
  OleDbDataAdapter da = new OleDbDataAdapter(objCommand);
  DataTable dt = new DataTable();
  da.Fill(dt);
  PopulateNodes(dt, parentMenu.ChildItems);
}

private void PopulateNodes(DataTable dt, MenuItemCollection items)
{
  foreach (DataRow dr in dt.Rows)
  {
    MenuItem mi = new MenuItem 
    {
      Text = dr["title"].ToString();  
      Value = dr["id"].ToString();
    }
    items.Add(mi);
    //If node has child nodes, then enable on-demand populating
    bool flag = ((int)(dr["childnodecount"]) > 0);
    if (flag)
    {
      menuCreate(mi);
    }
  }
}
private void menuCreate(MenuItem m)
{
  MenuEventArgs e = new MenuEventArgs(m);
  PopulateSubLevel(Int32.Parse(e.Item.Value), e.Item);
}

这是数据库脚本

用于模式生成

 CREATE TABLE [dbo].[SAMPLECATEGORIES](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [parentid] [int] NULL,
    [title] [nvarchar](255) COLLATE SQL_SwedishStd_Pref_CP1_CI_AS NOT NULL
)  

用于测试,数据样本

INSERT INTO [dbo].[SAMPLECATEGORIES] ([id], [parentid], [title]) VALUES (1, NULL, N'Category 1')
INSERT INTO [dbo].[SAMPLECATEGORIES] ([id], [parentid], [title]) VALUES (2, NULL, N'Category 2')
INSERT INTO [dbo].[SAMPLECATEGORIES] ([id], [parentid], [title]) VALUES (3, NULL, N'Category 3')
INSERT INTO [dbo].[SAMPLECATEGORIES] ([id], [parentid], [title]) VALUES (4, 1, N'Category 1.1')
INSERT INTO [dbo].[SAMPLECATEGORIES] ([id], [parentid], [title]) VALUES (5, 1, N'Category 1.2')
INSERT INTO [dbo].[SAMPLECATEGORIES] ([id], [parentid], [title]) VALUES (6, 2, N'Category 2.1')
INSERT INTO [dbo].[SAMPLECATEGORIES] ([id], [parentid], [title]) VALUES (7, 2, N'Category 2.2')
INSERT INTO [dbo].[SAMPLECATEGORIES] ([id], [parentid], [title]) VALUES (8, 2, N'Category 2.3')
INSERT INTO [dbo].[SAMPLECATEGORIES] ([id], [parentid], [title]) VALUES (9, 7, N'Category 2.2.1')
INSERT INTO [dbo].[SAMPLECATEGORIES] ([id], [parentid], [title]) VALUES (10, 7, N'Category 2.2.2')
INSERT INTO [dbo].[SAMPLECATEGORIES] ([id], [parentid], [title]) VALUES (11, 10, N'Category 2.2.2.1')
INSERT INTO [dbo].[SAMPLECATEGORIES] ([id], [parentid], [title]) VALUES (12, 6, N'Category 2.1.1')
INSERT INTO [dbo].[SAMPLECATEGORIES] ([id], [parentid], [title]) VALUES (13, 3, N'Category 3.1')
INSERT INTO [dbo].[SAMPLECATEGORIES] ([id], [parentid], [title]) VALUES (14, 7, N'Category 2.2.3') 

我希望这篇文章能帮助到你。

经过一天的研究,我编写了这段代码,它对其他人非常有帮助。

编辑历史: 

2013年10月29日:将类型更改为技巧/窍门并进行了一些小的格式更正 

© . All rights reserved.