Avatar billede filix Nybegynder
13. juni 2009 - 20:44 Der er 17 kommentarer

Hvordan tilgår jeg en dynmaisk generert kontrol i en anden metode (samme code behind file)

Hejsa Xperts :)

jeg sidder og laver et lile nyheds modul med kommentar mulighed, og for hver nyhed er der selvfølgelig forskellige comments, alt bliver generert dynamisk ud fra en database. Men for hver nyhed der bliver generet opretter jeg en "linkbutton" med et dynamisk id, og i dens click event skulle jeg gerne kunne tilgå kontrollen/eller andre af de generet kontroller. se neden for  :
----------------------------------------------
            LinkButton btnComment = new LinkButton();
            btnComment.ID += ni.getNewsId().ToString();
            btnComment.Text = al.Count.ToString() + " Comments";
            btnComment.Click += OpenComment;      btnComment.Attributes.Add("pnlId",pnlComment.ID.ToString());
 
public void OpenComment(Object sender, EventArgs e)
    {
       
        HVORDAN FANGER JEG EN KONTROL HER :D
       
    }

----------------------------------------------
jeg har prøvet og løse det ved og sende Id'et på den control jeg skal tilgå(pnlId) men jeg ved ikke hvordan tilgår kontrollen uden og oprette en ny instance af den og det kan jeg ikke for så brokker den sig over at der er 2 med samme navn ... sry hvis det er for forvirrende, men basalt set hvordan for jeg adgang til en anden kontrol i en anden metode
Avatar billede Syska Mester
13. juni 2009 - 20:53 #1
LinkButton l = this.Page.Controls.FindControl("nameofthecontrol") as LinkButton;
if(l != null)
{
// do something with the link button
}

Læg mærke til du appender dit NewsId ... til din button
Avatar billede filix Nybegynder
13. juni 2009 - 21:46 #2
jeg kan ik sige
this.Page.Controls.FindControl
men kan sige
this.Page.FindControl
håber der er lige så godt
Avatar billede Syska Mester
13. juni 2009 - 22:02 #3
ja, sikkert mig der husker lidt galt .. :-P

Page er vel en container i sig selv ... derfor den ik' har en Controls :-)

Men så burde du kunne finde dine dynamiske oprettede controls

// ouT
Avatar billede filix Nybegynder
13. juni 2009 - 22:14 #4
jeps nu kan jeg fange den MEN den siger at:
Object reference not set to an instance of an object.

min knap ser sådan her ud :
------------------------------
LinkButton lb = (LinkButton) sender;
      string pnlId = lb.Attributes["pnlId"];
        Panel pnl = this.Page.FindControl(pnlId) as Panel;
      pnl.Visible = true;
------------------------------

og har lige checket den for Id'et med fint nok .. det hedder CommentPanel2
Avatar billede filix Nybegynder
13. juni 2009 - 22:25 #5
min egen fejl tror jeg har fundet det :) tak
Avatar billede filix Nybegynder
13. juni 2009 - 22:48 #6
Nej har ik fundet fejlen :(

Jeg for stadig
Object reference not set to an instance of an object.
------------------------------
LinkButton lb = (LinkButton) sender;
      string pnlId = lb.Attributes["pnlId"];
        Panel pnl = this.Page.FindControl(pnlId) as Panel;
      pnl.Visible = true;
-----------------------------

Den har som sagt fint nok navnet med på kontrollen men bare som om at panelet ikke reagere på det ...
Avatar billede Syska Mester
13. juni 2009 - 22:58 #7
Hvad er det som ikke er:
Object reference not set to an instance of an object.

Men jeg vil sige det er en sjov opbygning ...

Hvad er formålet med alt det dynamisk opretede ?

Brug UserControl og Reapeter, DataList, GridView alt efter hvad du skal lave ... meget nemmere.

Virker som om du arbejder lidt mod asp.net webforms design principper.

// ouT
Avatar billede filix Nybegynder
13. juni 2009 - 23:10 #8
Det er selve pnl som ik har en object reference ....

Det er mest en challenge men også lige så meget for at lære noget nyt, en kammerat og jeg er ved og lave et lille cms som vi bare selv skal bruge ..... for jeg bryder mig ikke om at benytte repeatern nok mest fordi jeg synes ikke man altid har helt styr på hvordan tingene bliver generert.

så ja jeg arbejder meget imod webform prinipperne :)
Avatar billede Syska Mester
13. juni 2009 - 23:18 #9
Repeateren gør jo netop også kun hvad man beder den om, ingen ekstra markup udover det man selv laver :-)

Men mærkeligt at dit panel ik' er der ...

Sikker på du får det oprettet igen ? eller om din viewstate er der ?

Du må kunne sætte et break point og køre dit site i debug mode og se hvad controls der ligger på din Page ...

// ouT
Avatar billede filix Nybegynder
13. juni 2009 - 23:36 #10
okay :) det er også meget længe siden jeg har prøvet repeateren og tror det nok har været lige så meget min uearfarenhed dengang som gjorde at jeg ik helt følte kontrollen hehe :)

Ja har jeg også prøvet her den sidste time og den står bar som et null reference så lidt sært men sikkert bar mig som ska sove en time og læse igennem igen .. har vi vist alle været deR :)
Avatar billede Syska Mester
13. juni 2009 - 23:52 #11
ohh, også studerende kan jeg se :-)

Ja, god grund til at sove ... selvom eksamen er lige for døren *ARGHH*

Jeg ville i hvert fald kigge på Repeateren og deres ItemCommand ...

Virker mere som om du skal over i MVC hvis du vil lave det på den måde der ... det giver nogen helt andre muligheder og lader til at det ville passe dig bedre hvis du vil styre tingene på den måde.

Der kan du oprette alle er <form> du vil og gøre som du vil ... leger jeg selv med for tiden ... har sine fordele og ulemper :-)

// ouT
Avatar billede filix Nybegynder
13. juni 2009 - 23:57 #12
ja studerende :) hehe

er ved afslutningen på 4 sem datamatiker .. :)

okay jamen jeg vil da prøve mig lidt frem : )tak tak
Avatar billede windcape Praktikant
14. juni 2009 - 22:26 #13
Lidt mere fancy version, der også sikre at der ikke retuneres kastes til en forkert type:

var myLinkbox = Page.Controls.OfType<LinkButton>().Single(
    c => c.ID == "myLinkbox"
);
Avatar billede windcape Praktikant
14. juni 2009 - 22:30 #14
Og hvis du er ved at afslutte 4 semester burde du måske kigge mere på ASP.NET MVC, som lægger meget stærkt op af de design patterns du har lært på anden og trejde semester.

Samt at der ikke benyttes controls som i WebForms, men ren C#, og Helper methods (igen, Helper er et pattern du kan slå op i din Design Patterns bog).

Ellers skulle du overveje at kigge på en strong-typed repeater, http://www.codeproject.com/KB/aspnet/TypedRepeater.aspx

At give sig i kast med et fuldt Content Management system er nok lidt overkill hvis selv de mest basale og simple controls i ASP.NET vejer problemer.
Avatar billede windcape Praktikant
14. juni 2009 - 22:30 #15
Glemte et link til ASP.NET MVC: http://www.asp.net/mvc/
Avatar billede windcape Praktikant
14. juni 2009 - 22:33 #16
Og for sjov, som en extension (hvis i regner med at benytter det meget):

namespace WebApplication1
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            var myLinkbox = Page.FindControl<LinkButton>("myLinkbox");
        }
    }
   
    public static class LinqExtensions
    {
        public static T FindControl<T>(this Page page, string id)
            where T : Control
        {
            return page.Controls.OfType<T>().Single(
                c => c.ID == "myLinkbox"
            );               
        }
    }   
}
Avatar billede filix Nybegynder
14. juni 2009 - 23:26 #17
jeg siger rigtig mange tak til jer begge :) Jeg tror helt sikkert MVC bliver det næste jeg kaster blikket på :)

og bar for at afrunde fandt jeg en helt tredje løsning til og styre panelt med... ajax .. :) så nu er det simpelt og styre og få et fedt finish :)

WindCape hvis du nød og læse din warcraft bog(så lige din blog) så bestil dem www.fantask.dk istedet .. små 70 kr stykket .. har alle bøgerne.. de er ret fede de fleste af dem ..

Over and out :)
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