Avatar billede c-sharp Nybegynder
08. marts 2004 - 09:03 Der er 14 kommentarer og
1 løsning

Hjælp til menu i user control

Jeg har lavet en menu i en user control. Denne menu består af af nogle links, disse links vil jeg gerne have til at skifte farve når man køre musen over dem. Jeg har prøvet at bruge css (hover) i den sider der implementere user controllen, men det virker ikke. Hvordan kan jeg så lave det?


Et andet spørgsmål til min menu er om den kan laves lidt pænere, jeg har følgende kode:

Her bliver menu punkterne listet i en repeater:

<td width="12%" bgcolor="#000000" align=center><%# valgtPunkt(DataBinder.Eval(Container.DataItem, "modulNr"), DataBinder.Eval(Container.DataItem, "filnavn"), DataBinder.Eval(Container.DataItem, "menunavn"))%></td>


valgtPunkt retunere følgende:

Hvis menuen er på den valgte side:

    return "<span class=\"menu_Alm\" style=\"COLOR: red;\">" + menunavn.ToString()+ "</span>";


Hvis menuen ikke er på den valgte side:

    return "<a href=\"" + filnavn.ToString() + "\"><span class=\"menu_Alm\">" + menunavn.ToString() + "</span></a>";

Nogen ide til hvordan dette kan laves pænere, eller er det her måden at lave det på i .NET?
Avatar billede burningice Nybegynder
08. marts 2004 - 10:04 #1
hehe... ja, det kan godt gøres noget pænere ved hjælp af WebControls... du kan enten bruger HyperLink som svarer til et <a>-tag og Label som svarer til <span>.

Begge disse typer arver fra en base-control som implementerer forskellige attributer, heriblandt en CssClass og en Style hvor du kan tilføje forskellige styles.

For at udnytte det i din repeater skal du ændre din signatur på din metode så den returnerer et object af typen System.Web.UI.WebControls.WebControl, og dine to strenge skal ændres til

1)

Label l = new Label();
l.CssClass = "menu_Alm";
l.Style.Add("color", "red");
l.Text = menunavn.ToString();
return l;

2)

HyperLink hl = new HyperLink();
hl.NavigateUrl = filnavn.ToString();
hl.CssClass = "menu_Alm";
hl.Text = menunavn.ToString();
return hl;
Avatar billede c-sharp Nybegynder
08. marts 2004 - 11:06 #2
Når jeg gør som du har beskrevet, skriver den navnet på webcontrollen i menuen;

eks.
System.Web.UI.WebControls.Label
System.Web.UI.WebControls.HyperLink
System.Web.UI.WebControls.HyperLink
System.Web.UI.WebControls.HyperLink

Hard et noget at gøre med det tag jeg bruger til at præsentere data i repeateren:
<%# valgtPunkt(DataBinder.Eval(Container.DataItem, "modulNr"), DataBinder.Eval(Container.DataItem, "filnavn"), DataBinder.Eval(Container.DataItem, "menunavn"))%>
Avatar billede burningice Nybegynder
08. marts 2004 - 12:13 #3
hm.. ja, det er da også rigtigt nok... kan være vi skal fuske lidt så *smiler skummelt*

prøv at ændr din signatur af din metode tilbage til string. Istedet for at smide objectet retur renderer vi det bare og sender html'en tilbage:

1)
Avatar billede burningice Nybegynder
08. marts 2004 - 12:25 #4
1)

Label l = new Label();
l.CssClass = "menu_Alm";
l.Style.Add("color", "red");
l.Text = menunavn.ToString();

StringWriter sw = new StringWriter();
HtmlTextWriter htmlTextWriter = new HtmlTextWriter(sw);
l.Render(htmlTextWriter );
return sw.ToString();

og,ja... mon ikke du kan gætte 2'eren selv? :)


det er dog noget af en hovsaløsning. Istedet kan man sætte en placeholder i din template og override ItemDataBound der laver et af de to objecter og sætter det ind i placeholderen.
Avatar billede c-sharp Nybegynder
08. marts 2004 - 14:35 #5
SÅ er det måske lige før at den første løsning er lige så pæn.

Hvad med hensyn til det at teksten skifter farve når man køre musen henover?
Avatar billede burningice Nybegynder
09. marts 2004 - 08:34 #6
tja... det kan der være noget om... eneste ulempe ved din metode er at du ikke udnytter de indbyggede klasser til formålet i .Net. Det er bare lidt noget bæh at bruge ItemTemplate i DataReaderen til at udskrive menuen på, brug istedet ItemDataBound-eventen, hvor du kan få lov at lave noget conditional casting af dit object så det passer til den type der kommer fra valgtPunkt-metoden.
Avatar billede burningice Nybegynder
09. marts 2004 - 08:34 #7
ang. at skrifte fave skal du bruge a:hover i css
Avatar billede c-sharp Nybegynder
09. marts 2004 - 08:38 #8
Den virker ikke i min usercontrol!

Jeg fik iøvrigt ikke det her til at virke:

l.Render(htmlTextWriter );

Den brokker sig over "Render()"
Avatar billede burningice Nybegynder
09. marts 2004 - 08:55 #9
hm... det skal virke... :hover altså... http://www.webstartcenter.com/howto/css_links.php

Ang. det brok... hvilken fejl får du?
Avatar billede c-sharp Nybegynder
09. marts 2004 - 09:12 #10
Nu fatter jeg ikke en lyd...

Nu virker det, det er som om at den ikke rebuilder all når jeg beder om det! Nogle gange hvis jeg laver retur typen om på en metode slår det ikke igennem før jeg har makket rudt med det. Hvad kan det skyldes?

Nå men nu hvor det virker, så smid et svar så du kan få nogle velfotjente point!

Iøvrigt hvis du får tid til det kan du så give et eksempel på  den "mere rigtige" løsnig du referer til ? (Istedet kan man sætte en placeholder i din template og override ItemDataBound der laver et af de to objecter og sætter det ind i placeholderen.)
Avatar billede burningice Nybegynder
09. marts 2004 - 09:21 #11
hm, det ved jeg ikke lige, hvorfor at den skal være så tvær :/

men jo, jeg kan da lige komme med et eksempel.
Avatar billede c-sharp Nybegynder
09. marts 2004 - 09:33 #12
Tusind tak for din hjælp!

Glæder mig til at se dit eksempel (det haster ikke)
Avatar billede burningice Nybegynder
09. marts 2004 - 09:35 #13
noget i den retning

<asp:repeater id="rptProducts" runat="server">

    <ItemTemplate>
        <asp:PlaceHolder id="menuItem" runat="server" />
    </ItemTemplate>

</asp:repeater>

override protected void OnInit(EventArgs e)
{
    this.rptProducts.ItemDataBound += new RepeaterItemEventHandler(rptProducts_ItemDataBound);

    base.OnInit(e);
}

private void rptProducts_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                System.Data.OleDb.OleDbDataReader reader = (System.Data.OleDb.OleDbDataReader)e.Item.DataItem;
                int modelNr = (int)reader["modelNr"];
                string filNavn = (string)reader["filNavn"];
                string menuNavn = (string)reader["menuNavn"];
               
                PlaceHolder menuItem = e.Item.FindControl("menuItem");

                Control c = valgtPunkt(modelNr, filNavn, menuNavn);
                Label l;
                HyperLink hl;

                if (typeof(c) == typeof(Label))
                {
                    l = (Label)c;
                    menuItem.Controls.Add(l);
                }
                else if (typeof(c) == typeof(HyperLink))
                {
                    hl = (HyperLink)c;
                    menuItem.Controls.Add(hl);
                }
            }
        }
Avatar billede burningice Nybegynder
09. marts 2004 - 09:36 #14
eneste ting jeg er lidt usikker på er denne linje

System.Data.OleDb.OleDbDataReader reader = (System.Data.OleDb.OleDbDataReader)e.Item.DataItem;

da jeg ikke ved hvilken type du har brugt til at databinde til din repeater
Avatar billede burningice Nybegynder
09. marts 2004 - 09:39 #15
og egentlig, så skulle den casting slet ikke være nødvendigt... dette burde kunne bruges

private void rptProducts_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                System.Data.OleDb.OleDbDataReader reader = (System.Data.OleDb.OleDbDataReader)e.Item.DataItem;
                int modelNr = (int)reader["modelNr"];
                string filNavn = (string)reader["filNavn"];
                string menuNavn = (string)reader["menuNavn"];
               
                PlaceHolder menuItem = e.Item.FindControl("menuItem");

                Control c = valgtPunkt(modelNr, filNavn, menuNavn);
                menuItem.Controls.Add(c);
            }
        }
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester