Avatar billede danielfrost Nybegynder
11. marts 2004 - 13:49 Der er 15 kommentarer

FindControl TableCell

Hej med jer!

Så vidt jeg ved kan man manipulere med HTML tags, hvis de har en id og runat="server" parameter.

Jeg kan bare ikke få det til at virke :0(

Hvis jeg prøver dette, får jeg en fejl der siger at min programmet ikke kunne finde min Control.

Object not set to an instance of an object...

TableCell tdTopmenu = (TableCell)rptTopMenu.FindControl("td_topmenu");
tdTopmenu.Text = "dette er en test";

td_topmenu ligger i min ItemTemplate i Repeater.

Hvad gør jeg forkert?

/Daniel
Avatar billede dgivoni Nybegynder
11. marts 2004 - 14:02 #1
Jeg mindes at have loebet ind i samme problem, og det haenger sammen med at hvis du tjekker den html-kode som genereres, saa har den ikke noedvendigvis samme id, som du bruger server-side. Kan det passe?
Men jeg kan ikke huske hvordan jeg loeste det. Jeg tjekker lige om jeg kan finde det og vender tilbage...
Avatar billede burningice Nybegynder
11. marts 2004 - 14:54 #2
problemet ligger i, at td_topmenu ikke er en del af din repeaters control-collection, men i din ItemTemplate. Du skal derfor have fat i en reference til din itemtemplate og udføre FindControl-metoden på den.

det nemmeste måde at gøre det på er din repeaters ItemDataBound-event som bliver trigger't hver gang en ItemTemplate bliver oprettet.

Eksempel:

        private void rptProducts_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                int productId = int.Parse(((HtmlInputHidden)e.Item.FindControl("productId")).Value);
                DropDownList ddlColors = (DropDownList)e.Item.FindControl("ddlColors");
                Product p = new Product(productId);

                ddlColors.DataSource = p.Colors;
                ddlColors.DataBind();
            }
        }
Avatar billede danielfrost Nybegynder
11. marts 2004 - 15:06 #3
Ja! jeg tænkte det f...me nok :0)

Jeg prøver lige at få det til at spille!

/Daniel
Avatar billede burningice Nybegynder
11. marts 2004 - 15:09 #4
hvis du tænker over det, så giver det jo heller ikke mening at skrive

TableCell tdTopmenu = (TableCell)rptTopMenu.FindControl("td_topmenu");

da der jo vil findes n antal celler, alt efter hvor mange items der er blevet bindet til repeateren.
Avatar billede burningice Nybegynder
11. marts 2004 - 15:11 #5
så, en anden måde du kan gøre det på er også at tage din repater, hvis det er noget du vil gøre efter den er blevet renderet, løbe igennem alle dens items og udføre en FindControl på hvert af dem... hvis det fordi du vil manipulere med selve renderingen, så skal du bruge mit ovenstående eksempel
Avatar billede danielfrost Nybegynder
11. marts 2004 - 15:26 #6
En helt anden ting!

Jeg kan ikke skrive private void... Til min onItemDataBound funktion!

Den kommer med en fejl:

Repeater_DataBound(object, System.Web.UI.WebControls.RepeaterItemEventArgs)' is inaccessible due to its protection level

Den ligger i samme klasse og fil!
Avatar billede dgivoni Nybegynder
11. marts 2004 - 15:28 #7
saa skal du aendre den til protected
Avatar billede danielfrost Nybegynder
11. marts 2004 - 15:31 #8
jeg får også at vide at det er en Invalid Cast jeg foretager mig!

TableCell lblMenuid = (TableCell)e.Item.FindControl("td_topmenu");

Kan man ikke det?

/Daniel
Avatar billede burningice Nybegynder
11. marts 2004 - 15:36 #9
nu sørger du vel for at lave dette tjek først?

if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)

evt. kan du prøve at lave en

Response.Write(e.Item.FindControl("td_topmenu").GetType().ToString());

først, for at se hvilken type det er du får smidt i skallen
Avatar billede danielfrost Nybegynder
11. marts 2004 - 15:42 #10
Hej fessor!

Det er sgu så herligt at lære nye debug metoder...især hvis man som mig stadig ikke kan kode ordenlig C#. Det kommer helt sikkert!

Jeg får smidt en System.Web.UI.HtmlControls.HtmlTableCell tilbage...! Er den så ikke god nok ?

/Daniel
Avatar billede burningice Nybegynder
11. marts 2004 - 15:48 #11
:) jo, så skal du bare sørge for at caste til HtmlTableCell istedet for TableCell... og hvis du vil vide hvorfor, så kommer forklaringen her:

TableCell er en webcontrol, og bruges på aspx-siden sådan her: <asp:TableCell>
HtmlTableCell er en almindelige html-control og benyttes til at indkapsle en normal <td>'er som har fået sat runat="server" på sig



HtmlTableCell lblMenuid = (HtmlTableCell)e.Item.FindControl("td_topmenu");
Avatar billede burningice Nybegynder
11. marts 2004 - 15:50 #12
ang debug, så er det pænere at bruge Trace.Write... at bruge Response.Write til debug er noget snask og et levn fra gamle asp-dage :)
Avatar billede danielfrost Nybegynder
11. marts 2004 - 15:50 #13
Tak for svaret! Det virker som det skal nu!
Smider du et svar, så du kan få dine point...?
Avatar billede danielfrost Nybegynder
11. marts 2004 - 16:32 #14
Hey Fessor!

Hvordan kan det være at jeg får en gang miks maks vidst hvis jeg tilføjer et ID og Runat til et <a> tag... ligsom her:

<a class="topmenu" href='Locator.aspx?tm=<%# DataBinder.Eval(Container.DataItem, "pk_menu")%>'><%# DataBinder.Eval(Container.DataItem, "menu")%></a>

Så viser den bare noget uforståeligt HTML!!!

Er der en forklaring på det?
Avatar billede burningice Nybegynder
11. marts 2004 - 20:30 #15
vil du ikke gerne være flink og rent faktisk vise noget af dit uforståelige HTML istedet for bare at brokke dig ;)... kunne jo være at det rent faktisk ikke er så uforståeligt trods alt.
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