Populating using the SiteMapDataSource:
private void
CreateMenuControl()
{
Menu1.DataSource = GetSiteMapDataSource();
Menu1.DataBind();
}
private SiteMapDataSource GetSiteMapDataSource()
{
XmlSiteMapProvider xmlSiteMap = new XmlSiteMapProvider();
System.Collections.Specialized.NameValueCollection myCollection = new System.Collections.Specialized.NameValueCollection(1);
myCollection.Add("siteMapFile", "Web.sitemap");
xmlSiteMap.Initialize("provider", myCollection);
xmlSiteMap.BuildSiteMap();
SiteMapDataSource siteMap = new SiteMapDataSource();
return siteMap;
}
{
Menu1.DataSource = GetSiteMapDataSource();
Menu1.DataBind();
}
private SiteMapDataSource GetSiteMapDataSource()
{
XmlSiteMapProvider xmlSiteMap = new XmlSiteMapProvider();
System.Collections.Specialized.NameValueCollection myCollection = new System.Collections.Specialized.NameValueCollection(1);
myCollection.Add("siteMapFile", "Web.sitemap");
xmlSiteMap.Initialize("provider", myCollection);
xmlSiteMap.BuildSiteMap();
SiteMapDataSource siteMap = new SiteMapDataSource();
return siteMap;
}
Populating using Database:
private void
PopulateMenu()
{
DataSet ds = GetDataSetForMenu();
Menu menu = new Menu();
foreach (DataRow parentItem in ds.Tables["Categories"].Rows)
{
MenuItem categoryItem = new MenuItem(( string )parentItem["CategoryName"]);
menu.Items.Add(categoryItem);
foreach (DataRow childItem in parentItem.GetChildRows("Children"))
{
MenuItem childrenItem = new MenuItem(( string )childItem["ProductName"]);
categoryItem.ChildItems.Add(childrenItem);
}
}
Panel1.Controls.Add(menu);
Panel1.DataBind();
}
private DataSet GetDataSetForMenu()
{
SqlConnection myConnection = new SqlConnection(GetConnectionString());
SqlDataAdapter adCat = new SqlDataAdapter("SELECT * FROM Categories", myConnection);
SqlDataAdapter adProd = new SqlDataAdapter("SELECT * FROM Products", myConnection);
DataSet ds = new DataSet();
adCat.Fill(ds, "Categories");
adProd.Fill(ds, "Products");
ds.Relations.Add("Children",ds.Tables["Categories"].Columns["CategoryID"],ds.Tables["Products"].Columns["CategoryID"]);
return ds;
}
{
DataSet ds = GetDataSetForMenu();
Menu menu = new Menu();
foreach (DataRow parentItem in ds.Tables["Categories"].Rows)
{
MenuItem categoryItem = new MenuItem(( string )parentItem["CategoryName"]);
menu.Items.Add(categoryItem);
foreach (DataRow childItem in parentItem.GetChildRows("Children"))
{
MenuItem childrenItem = new MenuItem(( string )childItem["ProductName"]);
categoryItem.ChildItems.Add(childrenItem);
}
}
Panel1.Controls.Add(menu);
Panel1.DataBind();
}
private DataSet GetDataSetForMenu()
{
SqlConnection myConnection = new SqlConnection(GetConnectionString());
SqlDataAdapter adCat = new SqlDataAdapter("SELECT * FROM Categories", myConnection);
SqlDataAdapter adProd = new SqlDataAdapter("SELECT * FROM Products", myConnection);
DataSet ds = new DataSet();
adCat.Fill(ds, "Categories");
adProd.Fill(ds, "Products");
ds.Relations.Add("Children",ds.Tables["Categories"].Columns["CategoryID"],ds.Tables["Products"].Columns["CategoryID"]);
return ds;
}
XML file to populate the menu:
Web.sitemap is also a simple xml file. But I just wanted to show that you can also populate the menu using ordinary XML file.
private void
CreateMenuWithXmlFile()
{
string path = @"C:\MyXmlFile.xml";
DataSet ds = new DataSet();
ds.ReadXml(path);
Menu menu = new Menu();
menu.MenuItemClick += new MenuEventHandler(menu_MenuItemClick);
for ( int i = 0; i < ds.Tables.Count; i++)
{
MenuItem parentItem = new MenuItem(( string )ds.Tables[i].TableName);
menu.Items.Add(parentItem);
for ( int c = 0; c < ds.Tables[i].Columns.Count; c++)
{
MenuItem column = new MenuItem(( string )ds.Tables[i].Columns[c].ColumnName);
menu.Items.Add(column);
for ( int r = 0; r < ds.Tables[i].Rows.Count; r++)
{
MenuItem row = new MenuItem(( string )ds.Tables[i].Rows[r][c].ToString());
parentItem.ChildItems.Add(row);
}
}
}
{
string path = @"C:\MyXmlFile.xml";
DataSet ds = new DataSet();
ds.ReadXml(path);
Menu menu = new Menu();
menu.MenuItemClick += new MenuEventHandler(menu_MenuItemClick);
for ( int i = 0; i < ds.Tables.Count; i++)
{
MenuItem parentItem = new MenuItem(( string )ds.Tables[i].TableName);
menu.Items.Add(parentItem);
for ( int c = 0; c < ds.Tables[i].Columns.Count; c++)
{
MenuItem column = new MenuItem(( string )ds.Tables[i].Columns[c].ColumnName);
menu.Items.Add(column);
for ( int r = 0; r < ds.Tables[i].Rows.Count; r++)
{
MenuItem row = new MenuItem(( string )ds.Tables[i].Rows[r][c].ToString());
parentItem.ChildItems.Add(row);
}
}
}