Générer Imbriquée Menu de table de données à l'aide de c# ul liste pas Asp.net Menu de contrôle

J'ai besoin de générer un menu personnalisé qui a du sous-menu à l'aide de la liste ul de la DataTable

Ci-dessous est l'exemple de Base de données et de l'échantillon HTML ul liste avec les données factices.

PID         MENU                 Handler                  PageLangID  ParentID    IssueID     CatID       MenuPosition
----------- -------------------- ------------------------ ----------- ----------- ----------- ----------- ------------
6           Business             Category.aspx    1           6           1           16          1
6           Culture              Category.aspx    1           6           1           3           1
6           Economy              Category.aspx    1           6           1           2           1
6           Finance              Category.aspx    1           6           1           19          1
6           Infrastructure       Category.aspx    1           6           1           17          1
6           Lifestyle            Category.aspx    1           6           1           20          1
6           Others               Category.aspx    1           6           1           21          1
6           People               Category.aspx    1           6           1           7           1
6           Politics             Category.aspx    1           6           1           1           1
6           Sports               Category.aspx    1           6           1           4           1
12          1002                  Default.aspx             1           12          3           1           1
12          1003                  Default.aspx             1           12          4           1           1
12          1006                  Default.aspx             1           12          1           1           1
12          1009                  Default.aspx             1           12          5           1           1
1           Home                 Default.aspx             1           0           1           1           10
11          Video                Videos.aspx              1           10          1           1           10
2           About Us             Page.aspx                1           0           1           1           20
5           Articles             Articles.aspx            1           0           1           1           20
6           Categories           Category.aspx    1           0           

SOUHAITÉ LA SORTIE HTML

<div id="nav-wrapper">
<ul id="nav" class="dropdown dropdown-linear"  >
<li><span class="dir"><a href="./">Home</a></span></li>
<li ><span class="dir"><a href="ultimate.linear.html">About Us</a></span>
<ul >
<li><a href="./">History</a></li>
<li><a href="./">Our Vision</a></li>
<li><a href="./">The Team</a></li>
<li><a href="./">Clients</a></li>
<li><a href="./">Testimonials</a></li>
<li><a href="./">Press</a></li>
<li><a href="./">FAQs</a></li>
</ul>
</li>
<li class="active" ><span class="dir"><a href="ultimate.linear-active.html">Categories</a></span>
<ul>
<li><a href="./">Politics</a></li>
<li><a href="./">Economy</a></li>
<li><a href="./">Finance</a></li>
<li><a href="./">Business</a></li>
<li><a href="./">Group News</a></li>
<li><a href="./">Culture</a></li>
<li><a href="./">Lifestyle</a></li>
<li><a href="./">Sports</a></li>
<li><a href="./">Infrastructure</a></li>
<li><a href="./">Book Review</a></li>   
<li><a href="./">Others</a></li>                
</ul>
</li>
</ul>
</div> 

Je ne veux pas utiliser imbriquée répétition des contrôles. J'aimerais avoir un exemple de code qui me permet de travailler avec.

Mis à JOUR: Ce code ne fonctionne pas, vraiment je suis en train de faire quelque chose de mal

protected void Page_Load(object sender, EventArgs e)
{
DataSet ds = new DataSet();
ds = DataProvider.Connect_Select(strSql);
DataTable dt = ds.Tables[0];
//dt.Select("ParentID == 0") ;
var s = GenerateUL(dt.Select("ParentID == 0"));
Response.Write(s);
}
private string GenerateUL(var menus)
{
var sb = new StringBuilder();
sb.AppendLine("<ul>");
foreach (var menu in menus)
{
if (menu.Menus.Any())
{
sb.AppendLine("<li>" + menu.Text);
sb.Append(GenerateUL(menu.Menus.AsQueryable()));
sb.AppendLine("</li>");
}
else
sb.AppendLine("<li>" + menu.Text + "</li>");
}
sb.AppendLine("</ul>");
return sb.ToString();
}

DERNIÈRE MISE À JOUR BASÉ SUR DANI SOLUTION

Il semble fonctionner très bien avec son échantillon de données mais quand je l'utilise avec mes données de générer des StackOverflowException était non gérée.

Ci-dessous la capture d'écran de l'erreur.
Générer Imbriquée Menu de table de données à l'aide de c# ul liste pas Asp.net Menu de contrôle

D'erreur est généré quand il s'en va en une sorte d'infinité boucle où PID=6 Mes données réelles qui est affichée au-dessus de a 23 dossiers & est le résultat de l'UNION de différents tabel c'est la raison pour laquelle j'ai plusieurs lignes dans la table où PID=6 j'ai peur qu'il va aussi faire de même lorsque la pid=12.

Même si j'attrape l'exception de mon site encore tomber en panne à cause de cette ...

De CODE plus tard,

protected void Page_Load(object sender, EventArgs e)
{
string strSql = "SELECT DISTINCT PID, MENU, Handler,PageLangID, ParentID,IssueID, CatID,MenuPosition FROM MENUTABLE ";
DataSet ds = new DataSet();
ds = DataProvider.Connect_Select(strSql);
DataTable table = ds.Tables[0];
DataRow[] parentMenus = table.Select("ParentId = 0");
var sb = new StringBuilder();
string unorderedList = GenerateUL(parentMenus, table, sb);
}
private string GenerateUL(DataRow[] menu, DataTable table, StringBuilder sb)
{
sb.AppendLine("<ul>");
try
{
if (menu.Length > 0)
{
foreach (DataRow dr in menu)
{
ctr = ctr + 1;
string handler = dr["Handler"].ToString();
string menuText = dr["MENU"].ToString();
string line = String.Format(@"<li><a href=""{0}"">{1}</a>", handler, menuText);
sb.Append(line);
string pid = dr["PID"].ToString();
DataRow[] subMenu = table.Select(String.Format("ParentId = {0}", pid));
if (subMenu.Length > 0)
{
var subMenuBuilder = new StringBuilder();
sb.Append(GenerateUL(subMenu, table, subMenuBuilder));
}
sb.Append("</li>");
}
}
}
catch (Exception ex)
{
}
sb.Append("</ul>");
return sb.ToString();
}

Mise à jour: Lorsque je modifie ma requête qui m'obtenir le résultat ci-dessous puis il fonctionne très bien, mais il serait bon de le faire fonctionner sur des données réelles qui s'affiche en premier dans la question.

PID         MENU                 Handler                  PageLangID  ParentID    IssueID     CatID       MenuPosition
----------- -------------------- ------------------------ ----------- ----------- ----------- ----------- ------------
1           Home                 Default.aspx             1           0           1           1           10
2           About Us             Page.aspx                1           0           1           1           20
3           News                 News.aspx                1           0           1           1           30
5           Articles             Articles.aspx            1           0           1           1           20
6           Categories           Category.aspx    1           0           1           1           25
C'est déjà demandé,vous pouvez le voir sur le lien ci-dessous stackoverflow.com/questions/3485434/...
Semble une bonne solution, mais je ne suis pas capable de la comprendre comme elle l'utilisation de LINQ et DataClasses1DataContext . J'en ai besoin pour asp.net-formulaire à l'aide de c#
supprimer Dataclass1datacontext et au contexte, et au lieu de contexte, vous pouvez utiliser myDataTable.Sélectionnez("ParentID == 0") et au lieu de IQueryable<Menu> menus, vous pouvez utiliser les menus var.
Remercie de votre aide j'ai mis à jour la question, mais il ne fonctionne pas, je suis en train de faire quelque chose de mal dans le code.

OriginalL'auteur Learning | 2013-01-03