anbjMedlem sedan juli 2000232 inlägg Jag sitter och försöker göra en enkel meny i form av en horizontell bar där det meny alternativ man har klickat på får en annan bakgrundsfärg än övriga. Menyn byggs upp av en databas och anpassas efter användarens profil. I klassisk ASP hade jag antagligen bara skickat med ett id på det menyalternativ jag klickar på och sedan matchat det mot databasens för att sedan sätta en annan bakgrundsfärg. Men hur gör man detta utan spaggetikod eller finns det rent av något smartare sätt att åstakomma samma sak i ASP.net?
Några idéer?
NETworkMedlem sedan juni 20011 732 inlägg Finns många sätt att göra det på. En enkel lösning, lägg menyn i en usercontrol med några panels. Så skapar du en publik variabel "Selected" i din usercontrol och sätter den på respektive sida som inkluderar menyn. Sedan använder du den variabeln för att sätta bakgrundsfärgen.
//aspx
<uc:MyMenu id="Menu1" Selected="1" runat="server"></uc:MyMenu>
//pseudokod
public int Selected;
swich (Selected)
{
case 1:
Panel.BackColor = Color.Blue;
Break;
}
VimpMedlem sedan juli 20022 537 inlägg Inte så här då NETwork? :P
<uc:MyMenu id="Menu1" Selected="1" runat="server"></uc:MyMenu>
NETworkMedlem sedan juni 20011 732 inlägg Haha, jo naturligtvis, en misslyckad copy&paste kallas det för! :) Tack för rättelsen (mitt inlägg ovan redigerat)
anbjMedlem sedan juli 2000232 inlägg Ska genast testa detta! :-)
anbjMedlem sedan juli 2000232 inlägg Hmm, problemet är ju att jag har olika många menyalternativ för olika användare eftersom menyn genereras från databasen. Jag skulle vilja att menyn fungerar oavsett hur många eller vilka menalternativ som ska visas... I ditt förslag behöver jag ju ha med alla menyalternativ i case satsen plus att jag måste ändra i den koden om jag skulle lägga till ett menyalternativ i databasen.
Kan man göra det mer dynamiskt??
NETworkMedlem sedan juni 20011 732 inlägg Visst, inga problem. Använd en repeater! Hämta dina menydata (vilka menydata som ska hämtas till den specifika användaren fixar du antagligen redan i sql-satsen), lägg datan i en collection av något slag (exempelvis en datatable) och ha den som datakälla till repeatern. Sedan är det bara att loopa ut dina data på valfritt sätt hur du nu vill att det ska se ut. Om du aldrig fyllt en repeater tidigare så finns det många trådar om hur det går till (och man kan göra på flera olika sätt).
<table>
<tr>
<asp:Repeater id="Repeater1" runat="server">
<ItemTemplate>
<td><asp:LinkButton ID="myLink" Runat="server"></asp:LinkButton></td>
</ItemTemplate>
</asp:Repeater>
</tr>
</table>
anbjMedlem sedan juli 2000232 inlägg Ja, jag började med att använda en repeater, men sedan stötte jag på patrull när jag skulle markera den valda menyalternativet med en annan bakgrundsfärg. Jag hittar inget sätt att säga att en viss TD i repeatern ska ha en annan bakgrund beroende på en variabel så att säga...
NETworkMedlem sedan juni 20011 732 inlägg Finns som alltid många sätt att lösa det på. Ett förslag:
Har du någon nyckel på dina menynoder? Alltså ett id som är unikt för varje nod (länk)? Om inte, lägg till ett sådant och hämta
nyckeln tillsammans med övriga data i din collection som fyller din repeater. Om du nu använder en linkbutton så finns det ett attribut som heter CommandName där du kan lägga nyckeln. När du sedan trycker på en länk så fångar du upp
ditt commandname och sparar det exempelvis i en kaka eller session. Därefter fyller du din repeater som vanligt.
En repeater har ett event som heter ItemDataBound - det körs för varje rad i din repeater när den fylls upp, en slags loop helt enkelt som du kan (ska) använda till mycket. Här kan du nu enkelt gå igenom varje länk och jämföra den med ditt sparade commandname med det commandname som finns i alla dina linkbuttons. När dessa är samma så är du i rätt rad och då är det bara att leta upp din td (du kan använda en vanlig td som en serverkontrol om du vill, se exemplet nedan) eller vad du nu ska sätta bakgrundsfärgen på. Nåt i den här stilen (lite pseudokod som vanligt):
//din repeater
<table>
<tr>
<asp:repeater id="Repeater1" runat="server">
<ItemTemplate>
[b]<td id="myTD" runat="server">[/b]
<asp:linkbutton CommandName='<%# nyckel %>' id="myLB" Runat="server"></asp:linkbutton>
</td>
</ItemTemplate>
</asp:repeater>
</tr>
</table>
// här fångar du upp ditt commandname
protected void myLB_Click(object sender, System.EventArgs e) {
Session["Selected"] = ((LinkButton)sender).CommandName;
//hämta dina menydata och bind om kontrollen:
BindRepeater();
}
// sedan kör du itemdatabound på din repeater
// där du letar upp den valda noden
private void Repeater1_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e) {
if(((LinkButton)e.Item.FindControl("myLB")).CommandName == Session["Selected"].ToString())
[b]((HtmlTableCell)e.Item.FindControl("myTD")).BgColor = Color.Blue;[/b]
}
Nåt sånt. Någon annan kanske har en snyggare lösning?
anbjMedlem sedan juli 2000232 inlägg Tack för tipset. Jag måste erkänna att jag gav upp och körde old school asp för att lösa saken. Men din variant borde funka, får se om jag orkar testa imorgon :-)