SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[MainMenu]( [MenuID] [int] NOT NULL, [ParentMenuID] [int] NULL, [LabelMenu] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [LinkMenu] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [TargetMenu] [varchar](10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [HighlightMenu] [varchar](10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, CONSTRAINT [PK_MainMenu] PRIMARY KEY CLUSTERED ( [MenuID] ASC ) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO EXEC dbo.sp_addextendedproperty @name=N'MS_Description', @value=N'Identity Column' ,@level0type=N'USER', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'MainMenu', @level2type=N'COLUMN', @level2name=N'MenuID' GO EXEC dbo.sp_addextendedproperty @name=N'MS_Description', @value=N'Name of the menu.' ,@level0type=N'USER', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'MainMenu', @level2type=N'COLUMN', @level2name=N'LabelMenu' GO EXEC dbo.sp_addextendedproperty @name=N'MS_Description', @value=N'Url for the label' ,@level0type=N'USER', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'MainMenu', @level2type=N'COLUMN', @level2name=N'LinkMenu' GO EXEC dbo.sp_addextendedproperty @name=N'MS_Description', @value=N'Main menu' ,@level0type=N'USER', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'MainMenu', @level2type=N'COLUMN', @level2name=N'HighlightMenu'
Query to insert records
INSERT INTO dbo.MainMenu SELECT 1,NULL,'Home,'#,'_self','1' UNION ALL SELECT 2,NULL,'Accessories,'#,'_self','2' UNION ALL SELECT 3,NULL,'Products,'#,'_self','3' UNION ALL SELECT 4,NULL,'Contact,'#,'_self','4' UNION ALL SELECT 5,2,'Accessory1,'#,'_self',NULL UNION ALL SELECT 6,3,'Product1,'#,'_self',NULL UNION ALL SELECT 7,3,'Product2,'#,'_self',NULL UNION ALL SELECT 8,5,'Accessory2,'#,'_self',NULL UNION ALL SELECT 9,5,'Accessory3,'#,'_self',NULL UNION ALL SELECT 10,8,'Acc,'#,'_self',NULLQuery to generate Insert statements
SELECT 'SELECT ' + CAST(MenuID AS VARCHAR) +',' + COALESCE(CAST(ParentMenuID AS VARCHAR), 'NULL')+ ',''' + LabelMenu + ','''+ LinkMenu + ','''+ TargetMenu + ''','+ (CASE WHEN HighlightMenu IS NULL OR HighlightMenu = '' THEN 'NULL' ELSE +''''+ HighlightMenu +'''' END) + ' UNION ALL' FROM dbo.MainMenu
C# Code
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { PopulateMenu(); } } private void PopulateMenu() { //Get the menu structure from the table DataSet dsMenu = GetDataSetForMenu(); foreach (DataRow drDataRow in dsMenu.Tables["Menu"].Rows) { //If the ParentMenuID is NullOrEmpty then it is the top most menu if (string.IsNullOrEmpty(Convert.ToString(drDataRow["ParentMenuID"]))) { MenuItem mainMenuItem = new MenuItem((string)drDataRow["LabelMenu"], Convert.ToString(drDataRow["MenuID"])); Menu1.Items.Add(mainMenuItem); //CreateSubMenu(dsMenu, drDataRow, mainMenuItem); } else //Otherwise it is the submenu { CreateSubMenu(dsMenu, drDataRow, new MenuItem()); } } } private void CreateSubMenu(DataSet dsSubMenu, DataRow drDataRow, MenuItem mainMenuItem) { //MenuID is the subMenu of the ParentMenuID //string MenuID = Convert.ToString(drDataRow["MenuID"]); string ParentMenuID = Convert.ToString(drDataRow["ParentMenuID"]); //Which is always true if (mainMenuItem.Text == string.Empty) { //If it is the firstChild of the parent find it here itself mainMenuItem = Menu1.FindItem(Convert.ToString(drDataRow["ParentMenuID"])); //If we can't able to find it in the main menu we have to look for sub-menu if (mainMenuItem == null) foreach (MenuItem mi in Menu1.Items) { //Find the ParentMenu by ParentMenuID mainMenuItem = GetParentMenuItem(mi, Convert.ToString(drDataRow["ParentMenuID"])); if (mainMenuItem == null) continue; if (!mainMenuItem.Text.Trim().Equals(string.Empty)) break; } } if (mainMenuItem == null) return; //This the child element if (!string.IsNullOrEmpty(ParentMenuID)) { MenuItem childrenItem = new MenuItem((string)drDataRow["LabelMenu"], Convert.ToString(drDataRow["MenuID"])); childrenItem.Target = (string)drDataRow["LinkMenu"]; mainMenuItem.ChildItems.Add(childrenItem); } } // Recursive function private MenuItem GetParentMenuItem(MenuItem root, string value) { MenuItem menuItem; //Is MenuItem has ChildItems if (root.ChildItems.Count > 0) { //Check which ChildItems is the Parent for (int i = 0; i < root.ChildItems.Count; i++) { menuItem = GetParentMenuItem(root.ChildItems[i], value); if (menuItem != null) return menuItem; } } if (root.Value == value) { return root; } else return null; } private DataSet GetDataSetForMenu() { String constr = "Server=10.16.105.171;Database=test;Uid=test;Pwd=test123;Connect Timeout=0; pooling='true'; Max Pool Size=200"; String query = @"SELECT MenuID, ParentMenuID, LabelMenu, LinkMenu FROM dbo.MainMenu ORDER BY MenuID ASC"; DataSet dsMenu = new DataSet(); using (SqlConnection conn = new SqlConnection(constr)) { SqlDataAdapter da = new SqlDataAdapter(query, conn); da.Fill(dsMenu); da.Dispose(); } dsMenu.DataSetName = "Menus"; dsMenu.Tables[0].TableName = "Menu"; DataRelation relation = new DataRelation("ParentChild", dsMenu.Tables["Menu"].Columns["MenuID"], dsMenu.Tables["Menu"].Columns["ParentMenuID"], true); relation.Nested = true; dsMenu.Relations.Add(relation); //This constraint cannot be enabled as not all values have corresponding parent values. return dsMenu; }Reference Exception: This constraint cannot be enabled as not all values have corresponding parent values. We will get this exception if we set 0 for ParentMenuID. Where the LabelMenu is parent. Since there is no MenuID with value 0
No comments:
Post a Comment