---
title: "Problem med trädmeny"
type: "forum-thread"
url: "https://www.webforum.nu/amne/dotnet/108756-problem-med-trädmeny"
topic: ".NET"
topic_url: "https://www.webforum.nu/amne/dotnet"
author: "andreas_lindh"
published: "2004-08-08T09:30:12.000Z"
updated: "2004-09-14T11:33:55.000Z"
replies: 9
views: 477
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/dotnet/108756-problem-med-trädmeny"
---

# Problem med trädmeny

## #1 — andreas_lindh, 2004-08-08T09:30Z

Jag har försökt kopiera [Macces meny](http://www.webforum.nu/showthread.php?s=&threadid=76224&forumid=148)  till asp.net men får det inte att fungera. Första och andra nivån i menyn fungerar men inte de andra nivåerna. 

När man klickar på en länk i nivå två stängs den nivån så att bara nivå ett visas.

Databasen ser ut så här
TabID int primary key
ParentTabID int
TabName nvarchar(50)

```
Dim intParentID, intGrpId, qstTabID, tabIndex As Integer
    Dim strParentID, strClass, strBullet, strPid, qstParentID, scriptname, subLink As String
    Dim dtMenu As New DataTable()

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        If Not Page.IsPostBack Then
            start()
        End If
    End Sub

    Private Sub start()
        qstTabID = Request.QueryString("tabID")
        qstParentID = Request.QueryString("parentTabID")
        tabIndex = Request.QueryString("tabIndex")
        scriptname = "menutest.aspx"
        dtMenu = GetMenuItems("SELECT tabID,parentTabID,tabName FROM tabs WHERE TabID > 0 ORDER BY tabOrder ")
        Response.Write("<HTML><HEAD><STYLE TYPE=""text/css"">" & vbCrLf)
        Response.Write(".catlink      {color: #3A3A3A; font-family: verdana,arial; font-size: 10px; text-decoration: none;}" & vbCrLf)
        Response.Write(".sublink      {color: #3A3A3A; font-family: verdana,arial; font-size: 10px; text-decoration: none;}" & vbCrLf)
        Response.Write(".catlinkactive{color: #000000; font-family: verdana,arial; font-size: 10px; text-decoration: none; Font-weight:bold;}" & vbCrLf)
        Response.Write(".sublinkactive{color: #000000; font-family: verdana,arial; font-size: 10px; text-decoration: none; Font-weight:bold;}" & vbCrLf)
        Response.Write("</STYLE></HEAD><BODY>" & vbCrLf)
        Response.Write("<br><br><TABLE border='0' cellspacing='0' cellpadding='1' width='50%' align='center'>")
        intGrpId = 15 'qstTabID   'de lnkar som ska vara p niv ett r barn till grupp 1 (allts parent_page_id i databasen r =1)
        LinkTree(intGrpId, 0)
        Response.Write("</table>")
    End Sub

    Function LinkTree(ByVal intParent, ByVal intIndent)
        Dim X, Z As Integer
        For X = 0 To dtMenu.Rows.Count - 1
            If dtMenu.Rows(X).Item(1) = intParent And (CStr(dtMenu.Rows(X).Item(1)) = CStr(intGrpId) Or InStr(1, dtMenu.Rows(X).Item(1), qstParentID, CompareMethod.Text) > 0) Then
                strPid = ""
                Response.Write(vbCrLf & "<TR><TD bgcolor='#ffffff'>")
                For Z = 1 To intIndent
                    Response.Write("<img src='images/1px.gif' width='6' height='8' align='left'>")
                Next
                If intIndent = 0 Then
                    subLink = dtMenu.Rows(X).Item(0)
                    If CStr(qstTabID) = CStr(dtMenu.Rows(X).Item(0)) Then
                        strClass = "catlinkactive"
                        strBullet = "<img src='images/icon-active-dot.gif' border=0 align='left'>"
                    Else
                        strClass = "catlink"
                        strBullet = "<img src='images/icon-inactive-dot.gif' border=0 align='left'>"
                    End If
                Else
                    For Z = 1 To intIndent
                        strPid = strPid & Split(qstParentID, ",")(Z - 1) & ","
                    Next
                    subLink = strPid & dtMenu.Rows(X).Item(0)
                    If CStr(qstTabID) = CStr(dtMenu.Rows(X).Item(0)) Then
                        strClass = "sublinkactive"
                        strBullet = "<b>- </b>" 'kan ven vara bild som ovan
                    Else
                        strClass = "sublink"
                        strBullet = "- "
                    End If
                End If

                Response.Write("<a href='menutest.aspx?tabID=" & dtMenu.Rows(X).Item(0) & "&parentTabID=" & subLink & "&tabIndex=" & tabIndex & "' class='" & strClass & "'>" & vbCrLf)
                Response.Write(strBullet & dtMenu.Rows(X).Item(2) & "</a></TD></TR>" & vbCrLf)
                LinkTree(dtMenu.Rows(X).Item(0), intIndent + 1)

            End If
        Next
    End Function

    Private Function GetMenuItems(ByVal sql As String) As DataTable
        Dim arrRecords() As String
        Dim Connection As New SqlConnection(ConfigurationSettings.AppSettings("connectionString"))
        Dim dt As New DataTable()
        Dim cmd As SqlDataAdapter = New SqlDataAdapter(sql, Connection)
        cmd.Fill(dt)
        Dim i As Integer
        Dim dtc, dtc1, dtc2 As DataColumn
        Dim dtr As DataRow
        dtc = New DataColumn()
        dtc1 = New DataColumn()
        dtc2 = New DataColumn()
        dtc.ColumnName = "TabID"
        dtc1.ColumnName = "ParentTabID"
        dtc2.ColumnName = "TabName"
        dtMenu.Columns.Add(dtc)
        dtMenu.Columns.Add(dtc1)
        dtMenu.Columns.Add(dtc2)
        For i = 0 To dt.Rows.Count - 1
            dtr = dtMenu.NewRow
            dtr("tabID") = dt.Rows(i).Item(0)
            dtr("ParentTabID") = dt.Rows(i).Item(1)
            dtr("tabName") = dt.Rows(i).Item(2)
            dtMenu.Rows.Add(dtr)
        Next
        Connection.Close()
        Connection.Dispose()
        Return dtMenu
    End Function
```

Någon som kan se några fel på koden?

Permalänk: https://www.webforum.nu/p/108756

## #2 — andreas_lindh, 2004-08-09T13:25Z

Löste det. Bytte

```
If dtMenu.Rows(X).Item(1) = intParent And (CStr(dtMenu.Rows(X).Item(1)) = CStr(intGrpId) Or InStr(1, dtMenu.Rows(X).Item(1), qstParentID, CompareMethod.Text) > 0) Then
```

 

mot

```
if dtMenu.Rows(X).Item(1) = intParent And (CStr(dtMenu.Rows(X).Item(1)) = CStr(intGrpId) Or InStr(1, qstParentID, dtMenu.Rows(X).Item(1), CompareMethod.Text) > 0) Then
```

Permalänk: https://www.webforum.nu/p/1404462

## #3 — icaaq, 2004-09-07T11:33Z

Hur skrivs denna ut i C#

```
[red]
InStr(1, qstParentID, dtMenu.Rows(X).Item(1), CompareMethod.Text) > 0)[/red]
```

mv icaaq

Permalänk: https://www.webforum.nu/p/1432513

## #4 — icaaq, 2004-09-07T13:37Z

jag gör alltså samma sak som andreas_lindh men i C#
Så här långt har jag kommit.

```
[red]
namespace rrs
{
	using System;
	using System.Data;
	using System.Drawing;
	using System.Collections;
	using System.Collections.Specialized;
	using System.Web;
	using System.Web.UI.WebControls;
	using System.Web.UI.HtmlControls;
	using System.Diagnostics;

	/// <summary>
	///		Summary description for menu.
	/// </summary>
	public abstract class menu : System.Web.UI.UserControl
	{
		private string lnkId = null;
		private StringCollection sc = getQuery();
		int groupId = 1;
		public ArrayList gCollection;
		public StringCollection queryCollection = getQuery();
		public Table menuTable = new Table();
		private void Page_Load(object sender, System.EventArgs e)
		{	
			// Fyller min collection 
			this.gCollection = this.Fetchgroups();

			// Finns det object i min collection så kör jag igång med uppbyggnaden av menyn
			if (gCollection.Count > 0)
			{
				this.MakeMenuEntrys(groupId, 0);
			}
		}

		private void MakeMenuEntrys(int Parent, int indent)
		{
			for( int i = 0 ; i < gCollection.Count ; i++)
			{
				[b]if(((UI.Group)gCollection[i]).ParentId == Parent && ((UI.Group)gCollection[i]).ParentId == groupId || sc.Contains(((UI.Group)gCollection[i]).ParentId.ToString()))[/b]
				{
					LinkButton lButton = new LinkButton();
					lButton.Text = ((UI.Group)gCollection[i]).Headline;
					TableRow tr = new TableRow();
					TableCell tc = new TableCell();
					tc.Controls.Add(lButton);
					tr.Controls.Add(tc);
					menuTable.Controls.Add(tr);
					Controls.Add(menuTable);
                    this.MakeMenuEntrys(((UI.Group)gCollection[i]).Id, indent + 1);
				}				
			}			
		}
		private static StringCollection getQuery()
		{
			if(HttpContext.Current.Request.QueryString["parent"] != null)
			{
				StringCollection sc = new StringCollection();
				foreach(string s in HttpContext.Current.Request.QueryString["parent"].Split(new char[] {','})) 
				{
					sc.Add(s);
				}					
				return sc;
			}
			else
			{
				return new System.Collections.Specialized.StringCollection();
				
			}
		}
		// Här skapas en alternativ datakälla.
		private ArrayList Fetchgroups()
		{
			ArrayList gCollection = new ArrayList();

			UI.Group g = new UI.Group();
			g.Id = 11;
			g.ParentId = 1;
			g.Headline = "Andra";
			gCollection.Add(g);

			UI.Group g1 = new UI.Group();
			g1.Id = 12;
			g1.ParentId = 1;
			g1.Headline = "Tredje";
			gCollection.Add(g1);

			UI.Group g2 = new UI.Group();
			g2.Id = 13;
			g2.ParentId = 1;
			g2.Headline = "Fjärde";
			gCollection.Add(g2);

			UI.Group g3 = new UI.Group();
			g3.Id = 14;
			g3.ParentId = 12;
			g3.Headline = "Femte";
			gCollection.Add(g3);

			UI.Group g5 = new UI.Group();
			g5.Id = 15;
			g5.ParentId = 12;
			g5.Headline = "sjätte";
			gCollection.Add(g5);

			UI.Group g4 = new UI.Group();
			g4.Id = 16;
			g4.ParentId = 12;
			g4.Headline = "sjunde";
			gCollection.Add(g4);

			UI.Group g6 = new UI.Group();
			g6.Id = 17;
			g6.ParentId = 12;
			g6.Headline = "åttonde";
			gCollection.Add(g6);

			UI.Group g7 = new UI.Group();
			g7.Id = 18;
			g7.ParentId = 12;
			g7.Headline = "nionde";
			gCollection.Add(g7);

			return gCollection;
		}
		//protected override void CreateChildControls()
		
		#region Web Form Designer generated code
		override protected void OnInit(EventArgs e)
		{
			//
			// CODEGEN: This call is required by the ASP.NET Web Form Designer.
			//
			InitializeComponent();
			base.OnInit(e);
		}
		
		///		Required method for Designer support - do not modify
		///		the contents of this method with the code editor.
		/// </summary>
		private void InitializeComponent()
		{
			this.Load += new System.EventHandler(this.Page_Load);
		}
		#endregion
	}
[/red]
```

Har ni tid att hjälpa mig med detta. Jag tror att det är den feta raden som inte funkar för om jag sätter Querystringen parent till en 2:a så kommer sidan i en infinitive loop.....

mv icaaq

Permalänk: https://www.webforum.nu/p/1432601

## #5 — icaaq, 2004-09-07T13:57Z

jag ska tilläga att jag inte har med några länkar nu utan jag kör med manuell parentskrivning i adressfönstret.

Nu vill jag bara få den att funka.

mv icaaq

Permalänk: https://www.webforum.nu/p/1432616

## #6 — icaaq, 2004-09-07T19:46Z

Jag har ändrat/förfinat lite men fortfarande så kan jag inte se vad som är fel

```
[red]
		private void MakeMenuEntrys(int Parent, int indent)
		{
			foreach( UI.Group g in gCollection)
			{
				if(g.ParentId == Parent && g.ParentId == groupId || sc.IndexOf(Parent.ToString()) > -1)
				{
					HyperLink hl = new HyperLink();
					hl.Text = g.Headline;
					hl.NavigateUrl = HttpContext.Current.Request.CurrentExecutionFilePath + "?parent="+g.Id;
					TableRow tr = new TableRow();
					TableCell tc = new TableCell();
					tc.Controls.Add(hl);
					tr.Controls.Add(tc);
					menuTable.Controls.Add(tr);										
					this.MakeMenuEntrys(g.Id, indent + 1);
				}
			}					
		}
[/red]
```

Tacksamm för alla förslag .......

Permalänk: https://www.webforum.nu/p/1432883

## #7 — icaaq, 2004-09-07T21:58Z

Jag fortsätter att fråga. Det är väll inget fel på min datakälla?

```
[red]
		private ArrayList Fetchgroups()
		{
			ArrayList gCollection = new ArrayList();

			UI.Group g9 = new UI.Group();
			g9.Id = 9;
			g9.ParentId = 1;
			g9.Headline = "root";
			gCollection.Add(g9);

			UI.Group g = new UI.Group();
			g.Id = 11;
			g.ParentId = 1;
			g.Headline = "Andra";
			gCollection.Add(g);

			UI.Group g1 = new UI.Group();
			g1.Id = 12;
			g1.ParentId = 1;
			g1.Headline = "Tredje";
			gCollection.Add(g1);

			UI.Group g2 = new UI.Group();
			g2.Id = 13;
			g2.ParentId = 1;
			g2.Headline = "Fjärde";
			gCollection.Add(g2);

			UI.Group g3 = new UI.Group();
			g3.Id = 14;
			g3.ParentId = 11;
			g3.Headline = "Femte";
			gCollection.Add(g3);

			UI.Group g5 = new UI.Group();
			g5.Id = 15;
			g5.ParentId = 11;
			g5.Headline = "sjätte";
			gCollection.Add(g5);

			UI.Group g4 = new UI.Group();
			g4.Id = 16;
			g4.ParentId = 11;
			g4.Headline = "sjunde";
			gCollection.Add(g4);

			UI.Group g6 = new UI.Group();
			g6.Id = 17;
			g6.ParentId = 11;
			g6.Headline = "åttonde";
			gCollection.Add(g6);

			UI.Group g7 = new UI.Group();
			g7.Id = 18;
			g7.ParentId = 1;
			g7.Headline = "nionde";
			gCollection.Add(g7);

			return gCollection;
		}
[/red]
```

mv icaaq

Permalänk: https://www.webforum.nu/p/1432978

## #8 — icaaq, 2004-09-08T06:55Z

Godmorgon.
Nu har jag sovit på denna tråd och jag har inte något annat val än att dela upp mitt problem i sektioner. Hoppas att vi kan lösa mitt problem så smidigt som möjligt.  Jag delar upp sektionerna i orginalkod (Macces) och min nya (C#) 

Sektion 1: (Deklaration av variablar)
\- Inga komentarer.

```
[blue]
intLnkId		=		Request.Querystring("lnkid")
intQstParentId	=		Request.Querystring("parid")
strScriptname	=		Request.ServerVariables("SCRIPT_NAME")
arrLinks		=		GetRows("SELECT page_id,parent_page_id,linktext FROM tbl_links ORDER BY linktext ")
intGrpId		=		1 'de länkar som ska vara på nivå ett är barn till grupp 1 (alltså parent_page_id i databasen är = 1)
[/blue]
```

```
[red]

// Denna använder jag inte än.
private string lnkId = null;

// Här hämtar jag Querystringen["parent"].
private StringCollection sc = getQuery();

// Här anger jag vilket element som är toppparent.
int groupId = 1;

// Här deklarerar jag min datakälla
public ArrayList gCollection;

// Här hämtar jag min fil som allt ska länkas till
public string Path = HttpContext.Current.Request.CurrentExecutionFilePath;

// Här deklarerar jag min tabell som länkarna placeras i.
public Table menuTable = new Table();
[/red]
```

Sektion 2.  Kör igång med byggandet
\- Inga komentarer.

```
[blue]
If IsArray(arrLinks) Then
  Response.Write "<table cellspacing='0' cellpadding='1' class='mTable'>"&VbCrlf		
	Call LinkTree(intGrpId,0)
  Response.Write "</table>"
Else
	 Response.Write "Finns inga länkar"&VbCrlf	
End If
[/blue]
```

```
[red]
if (gCollection.Count > 0)
{
	this.MakeMenuEntrys(groupId, 0);
}
[/red]
```

Sektion 3. Den rekursiva (macces har här mer funktioner som jag kommer att lägga till senare)
\- Här är det stora problemet, Jag anser ju att jag har samma frågor i min if-sats som macce. 
Alltså **OM objectet som körs parentID = Parent(som skickats in i funktionen) OCH OM objectet som körs parentID = groupId(1) ELLER OM  Parent(som skickats in i funktionen) finns i Querystringen\["parent"\]**

```
[blue]
Sub LinkTree(intParent,intIndent) :	Dim X,Z
		For X = 0 To Ubound(arrLinks,2)		
			[b]If arrLinks(1,X) = intParent AND (Cstr(arrLinks(1,X))=Cstr(intGrpId) OR instr(","&qstParentId&",",","&intParent&",")>0) Then[/b]
			strPid=""
				Response.Write VbCrlf & "<TR><TD bgcolor='#ffffff'>"	
				For Z = 1 To intIndent									  
				  Response.Write("<img src='1px.gif' width='6' height='8' align='left'>")				 
				Next			
				IF intIndent=0 then 
				 Sublink=arrLinks(0,X)	
					 IF cstr(qstLnkId)  =  cstr(arrLinks(0,X)) THEN 
					 strClass  =  "catlinkactive"
					 strBullet =  "<img src='icon-active-dot.gif' border=0 align='left'>"
					 ELSE 
					 strClass  =  "catlink"
					 strBullet =  "<img src='icon-inactive-dot.gif' border=0 align='left'>"
					 END IF
				ELSE							
				For Z = 1 To intIndent : strPid=strPid&split(qstParentId,",")(Z-1) & "," : next
				 Sublink=strPid & arrLinks(0,X)
					 IF cstr(qstLnkId)  =  cstr(arrLinks(0,X)) THEN 
					 strClass  =  "sublinkactive"
					 strBullet =  "<b>- </b>"'kan även vara bild som ovan
					 ELSE 
					 strClass  =  "sublink"
					 strBullet =  "- "
					 END IF
				END IF				
				Response.Write("<a href='"&scriptname&"?lnkid="&arrLinks(0,X) &"&parid="&Sublink&"' class='"&strClass&"'>"&VbCrlf)	
				Response.Write(strBullet & arrLinks(2,X)& "</a></TD></TR>"&VbCrlf)
				Call LinkTree(arrLinks(0,X),intIndent + 1)			
			End If
		Next 
End Sub
[/blue]
```

```
[red]
private void MakeMenuEntrys(int Parent, int indent)
{
	foreach( UI.Group g in gCollection)
	{
		[b]if(g.ParentId == Parent && g.ParentId == groupId || sc.IndexOf(Parent.ToString()) > -1)[/b]
		{
			HyperLink hl = new HyperLink();
			hl.Text = g.Headline;
			hl.NavigateUrl = Path + "?parent="+g.Id;
			TableRow tr = new TableRow();
			TableCell tc = new TableCell();
			tc.Controls.Add(hl);
			tr.Controls.Add(tc);
			menuTable.Controls.Add(tr);										
			this.MakeMenuEntrys(g.Id, indent + 1);
		}
	}					
}[/red]
```

Min datakälla hittas tidigare i tråden, om det skulle vara något fel på den??

Attans, jag vill så gärna att denna ska fungera.

Brainstorma gärna med mig om vad som kan vara fel.

mv icaaq

Permalänk: https://www.webforum.nu/p/1433067

## #9 — icaaq, 2004-09-08T07:09Z

Jag kanske ska säga vad som händer just också.
När sidan laddas syns toppelementen (dem med parentId = 1)
Men när jag senare har en querystring\["parent"\] = 11 Så tycker jag att dem objecten som har ParentID = 11 ska synas under gruppen som har headline = "andra". Detta sker inte utan då kommer sidan i en oändlig loop.....

Hoppas att ni fattar annars får ni hojta till....

mv icaaq

Permalänk: https://www.webforum.nu/p/1433073

## #10 — icaaq, 2004-09-14T11:33Z

WeeEEEeEEeEe
Jag har fått det att fungera.......Det gick när jag satt dit lite () i if-satsen......

```
[red]
if(g.ParentId == Parent && [b]([/b]g.ParentId == groupId || sc.IndexOf(Parent.ToString()) > -1)[b])[/b][/red]
```

mv icaaq

Permalänk: https://www.webforum.nu/p/1436661

---

Tråden på webben: https://www.webforum.nu/amne/dotnet/108756-problem-med-trädmeny
