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.
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
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
Vous devez vous connecter pour publier un commentaire.
J'ai créé un peu plus simple structure de la table de mon côté que nous n'avons besoin que les colonnes suivantes pour exemple :
Des données de l'échantillon:
Comme vous pouvez le voir à partir de cet exemple, nous avons un 3 voies hiérarchie profonde pour le Produit et le reste des éléments n'ont pas d'enfants.
Code derrière:
Le code ci-dessous est le suivant:
Vérifie si un élément est un parent d'un nœud et obtient ses enfants de manière récursive.
Résultat final:
EDIT:
Le problème est que le code construit le menu basé sur ParentID et pour ID=6, le ParentID arrive aussi d'être 6. Jusqu'à 6 appels 6 et nous avons une boucle sans fin,grand.
Maintenant que nous savons ce qu'est la question, on peut mettre en une vérification simple de construire des sous-menus de manière récursive seulement si
ParentId != PID
, voici le code mis à jour:Je pense que la chose importante ici est de comprendre comment ce code fonctionne en marchant à travers elle dans le débogueur, de cette façon vous serez en mesure de changer si d'autres questions vous viennent.
StackOverFlowException
dans mon cas, après la mise en œuvre de votre solution. J'ai remarqué que je passe en boucle à l'infini dont j'ai été le débogage pour une raison quelconque, j'ai fait 23 lignes dans ma table j'ai pensé qu'il pourrait boucle de 23 temps, mais il fait une boucle plus que les & génère une erreur pour la où pid=6, je vais mettre à jour ma question & captures d'écran de l'erreur de référence. De toute façon je vous remercie de votre solution & j'espère que vous pourrez résoudre ce brumeux pour moiJ'ai fait une mise à jour.Essayez-le et laissez-moi savoir si cela résout votre problème!Veuillez marquer comme réponse si mon message vous a aidé
Merci il fonctionne maintenant avec le double PID également nécessaires. Vous remercie de l'aide. Je suis sûr que ce code va aider beaucoup de gens que je ne pouvais pas trouver un code similaire qui fonctionne avec datatable. Excellente Solution.
OriginalL'auteur Denys Wessels