Web-TorMedlem sedan nov. 200013 890 inlägg Det har blivit dags för mig att bygga den här menyn.
Databasen som jag utgår ifrån innehåller följande fält.
ID - sidans ID (t.ex. 1)
Name - det som ska stå i länken (t.ex. "Kontakt")
Section - anger vilken sektion sidan tillhör (t.ex. 1. "Kontakt", "Test 1" och "Test 2" är en sektion t.ex.)
Level - anger om det är nivå 1 eller nivå 2 (t.ex. 1)
SortOrder - anger i vilken ordning länkarna ska visas (t.ex. 1)
På bilden så skulle t.ex "Kontakt" innehålla följande värden:
ID - 123 (eller nåt annat)
Name - Kontakt
Section - 4 (eller nåt annat)
Level - 1
SortOrder - 4 (den ligger fjärden uppifrån)
Sidan "Test 1" skulle innehålla följande värden:
ID - 124 (eller nåt annat)
Name - Test 1
Section - 4
Level - 2
SortOrder - 1 (det är den översta länken under "Kontakt")
Jag har börjat lite smått men skulle behöva hjälp med resten.
//*** Hämtar sidans ID ***
int _node = Convert.ToInt16(Request.QueryString["node"]);
if (_node <= 0)
_node = 1;
MenuLabel.Text = _node.ToString();
//*** Hämta data ***
Database db = new Database();
DataSet ds = db.GetDataSet("SELECT colID, colName FROM tblContent ORDER BY colSortOrder");
DataView Source = ds.Tables[0].DefaultView;
//*** Skriver ut länkarna på sidan ***
for (int i=0; i < Source.Count; i++)
{
HyperLink link = new HyperLink();
MenuPH.Controls.Add(link);
link.Text = Source[i]["colName"].ToString();
link.NavigateUrl = "../default1.aspx?node=" + Source[i]["colID"].ToString();
if (Convert.ToInt16(Source[i]["colID"]) == _node)
link.CssClass = "menu1-on";
else
link.CssClass = "menu1";
Literal literal = new Literal();
literal.Text = "<br />\n";
MenuPH.Controls.Add(literal);
}
Web-TorMedlem sedan nov. 200013 890 inlägg Ingen som har lust att ge mig en knuff i rätt riktning?
Kolla på TreeView WebControl från Microsoft. Den kan du ändra utseendet på så du får den att se ut som du vill. Så slipper du göra allt jobb. Den kan du enkelt fylla rekursivt.
Web-TorMedlem sedan nov. 200013 890 inlägg Grejen är att jag redan byggt upp en databas m.m. och gärna skulle vilja använda den.
Sedan skulle jag gärna vilja bygga menyn själlv för att lära mig lite nya grejer.
Sedan är jag rädd att den där Microsoft-menyn ska slänga ut en massa äcklig DHTML. :p
Åter till min fråga: Är det verkligen ingen som har byggt en meny i ASP.NET? Hur är du uppbyggda?
NETworkMedlem sedan juni 20011 732 inlägg Vi har gjort en dynamisk meny som en asp-net-kontroll. Den kastar ut ett javascript samt vanliga divar där du placerar kontrollen som styrs från javascriptet. I de olika divarna har man naturligtvis en länk till ett css (där man styr HELA utseendet). Beroende på vilken läsare man har får man antagligen kasta ut javascriptet lite olika för att det ska funka. Som datakälla använder vi ett xml-dokument (mycket smidigare än en databas).
Som du gör nu så skulle du ju behöva göra en postback varje gång du öppnar ett menyalternativ (även om du inte skulle vilja öppna en ny sida). Här passar javascript perfekt...
Om du har vs.net finns det färdiga templates för hur du bygger egna kontroller. Det som är smidigt med det är ju inte minst att du kan återanvända den hur lätt som helst...
Web-TorMedlem sedan nov. 200013 890 inlägg
Som du gör nu så skulle du ju behöva göra en postback varje gång du öppnar ett menyalternativ (även om du inte skulle vilja öppna en ny sida). Här passar javascript perfekt...
Jag vill inte blanda in JavaScript, DHTML eller annat tjafs.
Varje "node" i menyn är en sida. Varje gång du klickar på nåt i menyn kommer du till en ny sida (inga postback-problem alltså).
Jag har hittat massor med super-duper menyer för xxx$ på nätet men jag är bara ute efter att enkelt vissa innehållet i några få kolumner från en databas. :x
Det här med XML-lagring dyker upp överallt. Jag förstår att det kan ha många fördelar men eftersom jag redan har hela sidans innehåll i databas känns det bökigt att dra in XML i det hela, eller?
NETworkMedlem sedan juni 20011 732 inlägg Ok. Oavsett hur du väljer att bygga upp din meny så rekommenderar jag varmt att du gör den som en asp.net-kontroll i alla fall, man vet aldrig när man behöver den igen och då är det kul med en kontrol... :) Här är det väl då iofs en klar fördel med xml, det är lätt att flytta, skulle du vilja använda menyn någon annanstans så måste du ha den där databasen också...
Web-Tor skrev:
Grejen är att jag redan byggt upp en databas m.m. och gärna skulle vilja använda den.
Du populatear alltså TreeView-kontrollen med data från en databas. Så det är ingen anledning att inte använda TreeView.
Web-TorMedlem sedan nov. 200013 890 inlägg Jag kommer inte närmare en egen lösning. :(
Trodde aldrig att det skulle va så här svårt att få tag i kod till en helt vanlig meny?
Hur jag än bygger det (XML eller databas, User Controll eller asp.net-kontroll, bra eller dåligt) så vill jag bara skriva ut följande på skärmen:
Sida 1.1
- Sida 1.2
- Sida 1.3
Sida 2.1
- Sida 2.2
- Sida 2.3
- Sida 2.4
Är det verkligen så svårt?
NETworkMedlem sedan juni 20011 732 inlägg Utan att gå in närmare på kod så behöver du ju iaf någon slags behållare runt de länkar du loopar fram. Antingen skapar du en tabell runt länkarna eller divar där du med styles fixar marginaler för att få effekten av att menyerna ligger i flera nivåer.
Har du bara två nivåer? Loopa igenom alla menyalternativ i nivå 1. Sedan har du någon inparameter på varje sida som anger vilken "nivå 2" som ska vara öppen och denna loop ligger naturligtvis i den första. Allt detta fyller du i en placeholder som du lägger in på sidan där du vill ha menyn.
Web-TorMedlem sedan nov. 200013 890 inlägg Ja, det är bara två nivåer.
Om du koller på mitt första inlägg så ser du att jag redan har gjort en del av jobbet (inparameter, placeholder m.m.). Det är det där med "loop i loop" som jag inte får till.
PS. Hör inte den här tråden hemma i ASP.NET-forumet? .DS
NETworkMedlem sedan juni 20011 732 inlägg Om du exempelvis har menyn i en usercontrol (det ska du ha va?) så skickar du in ett värde i denna på varje sida där du anger vilken nivå som ska vara öppen. Exempelvis:
<uc1:menu id="Menu1" Selected="3" runat="server"></uc1:menu>
Sedan i din loop så kollar du vilken som är selected med en if-sats för varje rad i menyn (där du ju hämtar uppgifter om vilken nod som för tillfället skrivs ut). Om if-satsen är sann (dvs när selected=3 så gör du en ny loop i ifsatsen somm loopar igenom undernivåerna för det valda menyalternativet. Sedan exakt vad du gör i den loopen är ju upp till dig beroende på hur du vill skapa menyn, med hjälp av en tabell, divar eller vad som helst...
Är du med på mina tankegångar?
Web-TorMedlem sedan nov. 200013 890 inlägg Grejen är att varje sida inte är en egen aspx-fil. Eftersom sidorna hämtar allt innehåll från databasen så är det svårt att hårdkoda in "selected" på sida. Jag skickar med en variabel för att hålla reda på vilket innehåll det är som ska visas.
index.aspx?node=10 « Det här betyder t.ex. att det är sidan tio som skall visas. ;)
Web-TorMedlem sedan nov. 200013 890 inlägg Går det att få in ett värde som skickas via adressfältet i den här taggen?
<uc1:menu id="Menu1" Selected="[i]HÄR SKA VÄRDET IN[/i]" runat="server"></uc1:menu>
Eller måste jag lösa det på nåt annat sätt?
NETworkMedlem sedan juni 20011 732 inlägg Javisst, antingen gör du det i koden eller om du vill (fuska) direkt på sidan:
<uc1:menu id="Menu1" Selected='<% Request.Querystring... %>' runat="server"></uc1:menu>
Web-TorMedlem sedan nov. 200013 890 inlägg Nja, jag håller ganska hårt på att koden ska ligga som code-behind. ;) Hur blir det då?
Nackdelen med den här lösningen är också att jag måste skicka två variabler hela tiden. En som håller reda på sidans id och en sån håller reda på "avdlindingen" (selected).
Som jag hade tänkt från början skulle det räcka med att skicka med sidan id och sedan ha avdlinginen (som sida ligger under) i databasen.
NETworkMedlem sedan juni 20011 732 inlägg
Web-Tor skrev:
Nja, jag håller ganska hårt på att koden ska ligga som code-behind. ;) Hur blir det då?
Helt rätt. :)
Först deklarerar du kontrollen (beroende på var den ligger)
protected myProject.myUserControl uc;
Sedan sätter du värdet så här:
uc.Attributes["Selected"] = Request.QueryString["Selected"];
NETworkMedlem sedan juni 20011 732 inlägg Tillägg: Om du vet vilken som är selected så behöver du väl inte något id på sidan också för att kunna loopa ut rätt meny? Eller hur menar du?
Web-TorMedlem sedan nov. 200013 890 inlägg Med "selected" så antar jag att du menar vilken nivå som är öppen? Sedan måste jag ju ha nåt som talar om viken sida som ska hämtas också, eller?
Om vi tittar på bilden som jag gjort så skulle alltså sidan Test 1 behöva två variabler:
• En som talar om att den ligger under "Kontakt"-avdelningen (selected)
• En som talar om att det är sidan "Test 1" som ska hämtas från databasen (node)
:q
Jag hade tänkt att det skulle räcka med att skicka in node i UC:n och att denna sedan skulle hålla koll på under vilken avdelning sidan hör hemma + att dessa sedan visas med orange färg.
Jag har som sagt en kolumn i DB:n (Section) som anger vilken avdelning som sidan tillhör.
NETworkMedlem sedan juni 20011 732 inlägg Aha, just ja. Ja, det är naturligtvis mycket smidigare om du skickar in exakt vilken nod som ska vara öppen och att du sedan i menyn plockar fram det du nu skickar in som "Selected". Klart att det går att lösa, frågan är bara hur... :) Du har ju section i din db som du borde kunna kolla när du loopar ut din meny i din uc, exempelvis genom att du först innan du loopar ut menyn plockar fram vilken section, och sedan i loopen har en ifsats som kollar när du är på den sektionen och där kör ytterligare en loop.