webForumDet fria alternativet

Problem med trädmeny

9 svar · 455 visningar · startad av andreas_lindh

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#1

Jag har försökt kopiera Macces meny 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?

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#2

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
icaaqMedlem sedan okt. 20005 273 inlägg
#3

Hur skrivs denna ut i C#

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

mv icaaq

icaaqMedlem sedan okt. 20005 273 inlägg
#4

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

icaaqMedlem sedan okt. 20005 273 inlägg
#5

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

icaaqMedlem sedan okt. 20005 273 inlägg
#6

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 .......

icaaqMedlem sedan okt. 20005 273 inlägg
#7

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

icaaqMedlem sedan okt. 20005 273 inlägg
#8

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

icaaqMedlem sedan okt. 20005 273 inlägg
#9

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

icaaqMedlem sedan okt. 20005 273 inlägg
#10

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

146 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
142 ms — hämta tråd, inlägg och bilagor (db)