asp.Net(C#)無限レベルメニューの生成

3467 ワード

まず、データベース・テーブルを作成するコードは次のとおりです.
無制限ツリーのデータベース・テーブル・コード
 
  
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[work_sysmenu]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[work_sysmenu]
GO
CREATE TABLE [dbo].[work_sysmenu] (
[flowid] [int] IDENTITY (1, 1) NOT NULL ,
[menu_title] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[menu_value] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[menu_url] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL ,
[menu_parent] [int] NULL ,
[menu_role] [varchar] (200) COLLATE Chinese_PRC_CI_AS NULL ,
[menu_meno] [text] COLLATE Chinese_PRC_CI_AS NULL ,
[isvalid] [int] NULL ,
[menu_order] [int] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

ここでmenu_parentはメニューのレベルコード、最上位は0、その他のレベルコードは上位メニューのflowidです.
ASP.NETでは、メニューとしてナビゲーションのMenuコントロールを使用します.
まず、レベル0のトップメニューをMenuに追加する必要があります.コードは次のとおりです.
 
  
///
///
///

private void GetSysMenu()
{
string str = "select * from work_sysmenu where dbo.GetCharCount(menu_role,'" + this.roleid +"')=1 and isvalid=1 order by menu_order";
DataSet ds= sysSqlRunner.getDataset(str);
DataRow[] drRoot = ds.Tables[0].Select("menu_parent=0");
//
foreach (DataRow dr in drRoot)
{
MenuItem mi = new MenuItem();
mi.Text = dr["menu_title"].ToString();
mi.Value = dr["menu_value"].ToString();
//mi.NavigateUrl = dr["menu_url"].ToString();
mi.Selectable = false;
mainMenu.Items.Add(mi);
//
CreateMenu(ds.Tables[0], dr["flowid"].ToString(), mi);
}
}

上のコードのsysSqlRunner.getDatasetは、SQLを実行してDatasetに戻るための独自のデータ永続層フレームワーク内のメソッドです.これは、自分のニーズに応じて異なるメソッドを使用することができます.もう1つのSQL文には、自分で書いたカスタム関数dboが含まれています.GetCharCountは、文字列の中にある文字が存在する個数を取得する役割を果たします.
 
  
Create function GetCharCount(@target varchar(100),@sear varchar(1))
returns int
as
begin
declare @charcount int
select @charcount=(len(@target)-len(replace(@target,@sear,'')))
return @charcount
end

次に、下位レベルのツリーを生成する方法コードを示します.
 
  
///
///
///

///
/// ID
/// Item
private void CreateMenu(DataTable dt,string parentID,MenuItem parItem)
{
DataRow[] drs= dt.Select("menu_parent=" + parentID);
if (drs.Length > 0)
{
foreach (DataRow dr in drs)
{
MenuItem mi = new MenuItem();
mi.Text = dr["menu_title"].ToString();
mi.Value = dr["menu_value"].ToString();
mi.NavigateUrl = dr["menu_url"].ToString();
parItem.ChildItems.Add(mi);
CreateMenu(dt, dr["flowid"].ToString(), mi);
}
}
else
{
return ;
}
}

はい、データテーブルにメニューレコードを追加するだけで、必要なレベルのメニューを生成できます.注意が必要なのはトップメニューのmenu_parent値は0でなければなりません.もちろんその上で必要に応じて修正することもできます.