Avatar billede ratzaiy Nybegynder
30. oktober 2007 - 11:30 Der er 16 kommentarer

LinkButton eventhandler i WebControl bliver ikke kaldt

Har et virkelig irriterende problem med at kalde en eventhandler på en LinkButton. Min kode ser sådan her ud

protected override void CreateChildControls()
        {
            base.CreateChildControls();
            Controls.Clear();
            canvas = (WebPart1)HttpContext.Current.Session["canvas"];
            switch (type)
            {
                case "TextFile":
                    {

           
                        break;
                    }

                case "Folder":
                    {
                        for (int i = 0; i <                                        fo.getFolderItemAL().Count; i++)
                        {

                            FolderItem tempFoI = (FolderItem)fo.getFolderItemAL()[i];

                            LinkButton link = new LinkButton();
                            link.ID = tempFoI.getFolderItemID().ToString();
                            link.Text = tempFoI.getFolderItemName();
                            string itemType = tempFoI.getFolderItemType();
                            link.CommandArgument = "" + tempFoI.getId();
                            link.OnClientClick += new EventHandler(this.navigateTextFile);
                            this.Controls.Add(link);
                        }
                        break;
                    }

                    case "Case":
                    {
   
                        }
                        break;
                    }     
            }
            ChildControlsCreated = true;
        }

public void navigateTextFile(object sender, EventArgs e)
        {
            DockableObject dockableObject = new DockableObject();
            TextFileMapper tfmpp = new TextFileMapper();

            LinkButton lbtn = (LinkButton)sender;
            TextFile tempTextFile = (TextFile)tfmpp.getTextFile(System.Convert.ToInt32(lbtn.CommandArgument));
            int id = tempTextFile.getTextFileID();
            string type = tempTextFile.getType();
            dockableObject.sendToCommand(type, id);

        }
Problemet er at ovenstående eventhandler aldrig bliver kaldt. Mine links forsvinder bare og andet sker der ikke.
Avatar billede sherlock Nybegynder
30. oktober 2007 - 11:56 #1
Hvad er FolderItem ?
Hvad returnerer getFolderItemID() ?

Måske giver det dublikerede kontrol-id'er
Avatar billede ratzaiy Nybegynder
30. oktober 2007 - 12:11 #2
FolderItem er et objekt der indeholder en arrayliste.
getFolderItemID() returner en int.
Avatar billede neoman Novice
30. oktober 2007 - 12:18 #3
"Mine links forsvinder bare og andet sker der ikke." kunne tyde på at dine links ikke bliver genskabt ved postback.

Dynamiske kontroller skal normalt genskabes igen efter postback senest i pageload - de huskes ikke af frameworket, kun deres viewstate.
Avatar billede ratzaiy Nybegynder
30. oktober 2007 - 12:24 #4
Det er også en tanke, som har strejfet mig, har prøvet på diverse måder at gemme linkene i en sessionsvariabel og i viewstate, men uden held. Hvordan kan jeg genskabe mine links efter postback?
Avatar billede neoman Novice
30. oktober 2007 - 12:32 #5
http://www.eksperten.dk/artikler/1103

Split din kode :

Del1. Til at skabe tomme dynamiske kontroller (og handlere).
Del2. Fylde værdier i.

I den event handler som skal skabe kontrollerne kalder du
Del1
Del2

Efterfølgende husker du, at du har gjort det: gem den info i f.eks. viewstate.  Efterfølgende, ved !IsPostBack, kald del1 i Init eller Load.

Hvis brugeren ikke selv ændrer noget i værdierne, kan du slå del1 og del2 sammen, selv om, at eksekvere del 2 igen ikke er nødvendigt, da værdierne allerede ligger i viewstate og behøver egentligt ikke blive tilføjet igen.
Avatar billede neoman Novice
30. oktober 2007 - 12:35 #6
og et lign. problem her til inspiration http://www.eksperten.dk/spm/801438
Avatar billede neoman Novice
30. oktober 2007 - 12:56 #7
Jeg har ikke erfaring i at bruge CreateChildControls - det fremgår ikke af din kode hvad kontrol du gør det for.

Men der anbefales at kalde EnsureChildControls() så man er sikker på at de childcontrols nu findes når man skal bruge dem. kan være dette er nok til at omgå dit problem.
Avatar billede ratzaiy Nybegynder
30. oktober 2007 - 13:27 #8
ja det er netop problemet. Jeg skaber kontrollerne i CreateChildControls(). Prøvede at kigge i  det spørgsmål du henviste til, men kunne ikke helt sammenligne det med mit, da hans Button bliver lavet på en aspx side.
Avatar billede neoman Novice
30. oktober 2007 - 13:34 #9
mekanikken er vel den samme:
1. lav kontrollen
2. fyld værdier i EFTER at kontrollen er tilføjet til kontroltræet

gentag 2 ved postback.
Avatar billede neoman Novice
30. oktober 2007 - 13:36 #10
I øvrigt:
                      link.OnClientClick += new EventHandler(this.navigateTextFile);

vil da aldrig virke, for OnCliaentClisk tilføjer en js-ting, mens du skal tilføjet en .NET servers-side handler, så:
                      link.OnClick += new EventHandler(this.navigateTextFile);
Avatar billede neoman Novice
30. oktober 2007 - 13:48 #11
øh det er vist noget sludder jeg skrev der - ved ikke helt hvordan du tilføjer en handler som skal håndtere en specifik type af event i C#

I vb ville det hedde, for en knap f.eks:

          '---add an event handler for the button
            AddHandler mybutton.Click, AddressOf button_Click
Avatar billede ratzaiy Nybegynder
30. oktober 2007 - 13:57 #12
Nu har jeg så prøvet følgende.

case "Folder":
                    {
                        for (int i = 0; i < fo.getFolderItemAL().Count; i++)
                        {

                            FolderItem tempFoI = (FolderItem)fo.getFolderItemAL()[i];

                            LinkButton link = new LinkButton();
                            this.Controls.Add(link);
                            link.ID = tempFoI.getFolderItemID().ToString();
                            link.Text = tempFoI.getFolderItemName();
                            string itemType = tempFoI.getFolderItemType();
                            link.CommandArgument = "" + tempFoI.getId();
                            link.Click += new EventHandler(this.navigateTextFile);
                            HttpContext.Current.Session["links"] = link;
                        }
                        break;
                    }

protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
           
            ArrayList links = (ArrayList)HttpContext.Current.Session["links"];
            if (links == null)
            {
               
            }
            else
            {
                for (int i = 0; i < links.Count; i++)
                {
                    for (int a = 0; a < fo.getFolderItemAL().Count; a++)
                    {

                        FolderItem tempFoI = (FolderItem)fo.getFolderItemAL()[a];
                        LinkButton link = (LinkButton)links[i];
                        link.ID = tempFoI.getFolderItemID().ToString();
                        link.Text = tempFoI.getFolderItemName();

                        link.CommandArgument = "" + tempFoI.getId();
                        link.Click += new EventHandler(this.navigateTextFile);
                        this.Controls.Add(link);
                    }
                }
             
            }

        }
Det er nøjeagtig det samme der sker. Ved ikke om det er helt i hampen, men det var umiddelbart sådan jeg opfattede at du mente det skulle gøres
Avatar billede neoman Novice
30. oktober 2007 - 21:19 #13
kom du videre med dette her ? jeg var lige strandet på noget som krævede lidt attention
Avatar billede ratzaiy Nybegynder
31. oktober 2007 - 10:26 #14
nej desværre, kunne stadig ikke få skidtet til at funke :(
Avatar billede neoman Novice
31. oktober 2007 - 17:10 #15
prøv at klistre lidt mere kode ind - hvilken kontrol er base ?
Avatar billede ratzaiy Nybegynder
02. november 2007 - 09:37 #16
Du får hele klassen.

ublic class RenderWebControls : WebControl
    {
        private TextFile tf;
        private Folder fo;
        private Case ca;
        private WebPart1 canvas;
        private string type;
     
        /// <summary>
        /// Her modtager vi et objekt samt en type
        /// fra dockableObject.checkOuterArray().
        /// I switchen finder vi ud af hvilken type vi har fået med
        /// samt typecaster objektet til den type det skal være
        /// </summary>
        public RenderWebControls(Object tempObject,string type)
        {
            this.type = type;

            switch (type)
                    {
                        case "TextFile":
                        {
                           
                            this.tf = (TextFile)tempObject;
                           
                            break;
                        }
                        case "Folder":
                        {
                            this.fo = (Folder)tempObject;
                           
                            break;
                        }
                        case "Case":
                        {
                            this.ca = (Case)tempObject;
                           
                            break;
                        }
        }


    }
        /// <summary>
        /// På baggrund af type bliver CreateChildControls
        /// kørt, så vi får renderet en WebControl
        /// med den type vi modtog i konstruktøren
        /// </summary>
        protected override void CreateChildControls()
        {
            base.CreateChildControls();
            Controls.Clear();
            canvas = (WebPart1)HttpContext.Current.Session["canvas"];

            switch (type)
            {
                case "TextFile":
                {

                    //Her indlæser vi den tekstfil der skal vises
                    //og løber igennem indholdet og lukker for forbindelsen til StreamReaderen
                    string sti = tf.getTextFilePath();
                    string dummydir = HttpContext.Current.Server.MapPath("Dummy");
                    StreamReader sr = File.OpenText(dummydir + sti);
                    string indhold = sr.ReadToEnd();
                    Label lbltext = new Label();
                    lbltext.ID = "lbltext";
                    lbltext.Text = indhold;
                    sr.Close();
                    this.Controls.Add(lbltext);

                    break;
                }

                case "Folder":
                {
                    for (int i = 0; i < fo.getItemAL().Count; i++)
                    {

                        Item tempItem = (Item)fo.getItemAL()[i];

                        LinkButton link = new LinkButton();
                        this.Controls.Add(link);
                        link.ID = tempItem.getItemID().ToString();
                        link.Text = tempItem.getItemName();
                        string itemType = tempItem.getItemType();
                        link.CommandArgument = "" + tempItem.getId();
                        link.Click += new EventHandler(this.navigateTextFile);
                    }
                    break;
                }

                    case "Case":
                    {
                        for (int i = 0; i < ca.getItemAL().Count; i++)
                        {

                            Item tempItem = (Item)ca.getItemAL()[i];

                            LinkButton link = new LinkButton();
                            link.ID = tempItem.getItemID().ToString();
                            link.Text = tempItem.getItemName();
                            string itemType = tempItem.getItemType();
                            link.CommandArgument = "" + tempItem.getId();
                            link.OnClientClick += new EventHandler(this.navigateTextFile);

                            this.Controls.Add(link);


                        }
                        break;
                    }     
            }
            ChildControlsCreated = true;
        }

        public void navigateTextFile(object sender, EventArgs e)
        {
            DockableObject dockableObject = new DockableObject();
            TextFileMapper tfmpp = new TextFileMapper();

            LinkButton lbtn = (LinkButton)sender;
            TextFile tempTextFile =                                                      (TextFile)tfmpp.getTextFile(System.Convert.ToInt32(lbtn.CommandArgument));
            int id = tempTextFile.getTextFileID();
            string type = tempTextFile.getType();
            dockableObject.sendToCommand(type, id);
        }
}
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

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