Avatar billede davidfossil Nybegynder
17. november 2004 - 08:36 Der er 12 kommentarer og
2 løsninger

Custom control med events

Jeg sidder i en situation hvor jeg skal bruge en custom control, nedarvet fra WebControl, der i sin Render()-metode udskriver en række LinkButtons. Disse LinkButtons skal alle sammen have den samme "OnClick" metode tilknyttet, som jeg ønsker at kunne sætte når jeg instansiere min nye custom control.

<min:SjovControl OnLinkButtonClick="SomeMethod" Runat="server" />

... skal altså kunne sætte en eventhandler for de LinkButtons der bliver renderet fra min SjovControl der binder dem til metoden "SomeMethod".

Jeg har læst om hvordan man deklerere events, men jeg kan altså ikke greje hvordan jeg fortæller den hvornår de skal affyres..?
Avatar billede burningice Nybegynder
17. november 2004 - 11:11 #1
Du skal have oprettet en public string OnLinkButton som refererer til din property der bliver sat på aspx-siden. Dernæst kobler du en eventhandler på på denne måde:

dinLinkButton.Click += new EventHandler(this.OnLinkButtonLink);

mon det går an?
Avatar billede burningice Nybegynder
17. november 2004 - 11:12 #2
er faktisk ikke helt sikker på den bliver godtaget, kigger lige i SDK'et
Avatar billede burningice Nybegynder
17. november 2004 - 11:17 #3
nej, det skal være metode der skal med som argument. Så skal man til at bruge noget reflection:

dinLinkButton.Click += new EventHandler(GetType().GetMethod(this.OnLinkButtonClick));
Avatar billede burningice Nybegynder
17. november 2004 - 11:28 #4
sad lige og læse det igennem igen... din "SomeMethod", er den erklæret på din aspx-side eller inde i selve kontrollen?

Hvis det først er tilfældet bliver det vist lidt mere kompliceret, for så skal du have fat i typen på den side kontrollen bliver sat ind på - og nej, man kan ikke bare bruge Page-propertyen, da den bare giver en reference til en System.Web.UI.Page-type :/
Avatar billede davidfossil Nybegynder
17. november 2004 - 17:58 #5
SomeMethod deklereres i .aspx.cs filen...
jeg har selv følgende idé, men den virker desværre ikke helt:

public class SjovControl : System.Web.UI.WebControls.Table
{
    private LinkButton linkBtn;
    public event CommandEventHandler SjovAction
    {
        add
        {
            if(linkBtn == null) linkBtn = new LinkButton();
            linkBtn.Command += value;
        }
        remove
        {
            if(linkBtn == null) linkBtn = new LinkButton();
            linkBtn.Command -= value;
        }
    }

    protected override void Render(HtmlTextWriter writer)
    {
        linkBtn.Text = "Tryk her";
        linkBtn.CommandName = "go";
        this.Controls.Add(linkBtn);
        base.Render(writer);
    }
}

det virker halvvejs, idet der faktisk renderes en linkbutton og der kommer en runtime fejl hvis du sætter OnSjovAction="MetodeNavnDerIkkeFindes" i .aspx filen...

eventhandleren bliver bare ikke "overført" rigtigt til min LinkButton, idet der intet sker når jeg klikker på den, andet end at siden loades igen.
( min SomeMethod indeholder en Response.Write("snask"), men der kommer ingen snask på skærmen )
Avatar billede burningice Nybegynder
17. november 2004 - 18:07 #6
skal du ikke også have en metode i klassen:

private void OnSjovAction() {
  if (this.SjovAction != null) {
      this.SjovAction(this, EventArgs.Empty);
  }
}

noget i den retning -  det er længe siden jeg har rodet at lave egne events :/
Avatar billede davidfossil Nybegynder
17. november 2004 - 18:14 #7
hmm, SjovAction er jo en event og denne metode vil altså ikke compile:
"The event 'SjovAction' can onlly appear on the left hand side of += or -="
Avatar billede burningice Nybegynder
17. november 2004 - 18:30 #8
har du ikke en delegate til dit event?
Avatar billede snepnet Nybegynder
17. november 2004 - 18:47 #9
nu har i jo nærmest dækket det hele af i bidder her, men i kan lige få generelt eksempel her - inklusiv customargument - hvis det kan hjælpe.

mvh

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace EXP2
{
    // en side til test
    public class LinkList : System.Web.UI.Page
    {
        protected HtmlForm Form1;

        private void Page_Load(object sender, System.EventArgs e)
        {
            LinkListControl ll = new LinkListControl();
            ll.LinkClick += new LinkClickEventHandler(ll_LinkClick);
            Form1.Controls.Add(ll);
        }

        override protected void OnInit(EventArgs e)
        {
            InitializeComponent();
            base.OnInit(e);
        }
       
        private void InitializeComponent()
        {   
            this.Load += new System.EventHandler(this.Page_Load);
        }

        private void ll_LinkClick(object sender, LinkClickEventArgs e)
        {
            Response.Write(String.Format("Der er klikket på {0} med index {1}", e.Link, e.LinkIndex));
        }
    }

    public delegate void LinkClickEventHandler(object sender, LinkClickEventArgs e);

    public class LinkClickEventArgs : EventArgs
    {
        private string link;
        private int linkIndex;

        public string Link
        {
            get{return link;}
        }

        public int LinkIndex
        {
            get{return linkIndex;}
        }
        public LinkClickEventArgs(string link, int linkIndex)
        {
            this.link = link;
            this.linkIndex = linkIndex;
        }
    }


    // og så kontrollen
    public class LinkListControl : WebControl, INamingContainer
    {
        // bare lige for nemheds skyld
        private string[] links = {"hej","med","dig","du","gamle"};

        protected object EventClicked = new object();

        public event LinkClickEventHandler LinkClick
        {
            add{Events.AddHandler(EventClicked, value);}
            remove{Events.RemoveHandler(EventClicked, value);}
        }
       
        protected void OnLinkClick(LinkClickEventArgs e)
        {
            LinkClickEventHandler h = (LinkClickEventHandler)Events[EventClicked];
            if(h != null)
                h(this, e);
        }

        protected override void CreateChildControls()
        {
            int index = 0;
            foreach(string link in links)
            {
                LinkButton lb = new LinkButton();
                lb.Text = link;
                lb.CommandArgument = string.Format("{0}", index++);
                lb.Click += new EventHandler(lb_Click);
                Controls.Add(lb);
            }
        }

        protected override void RenderContents(HtmlTextWriter writer)
        {
            foreach(Control c in Controls)
            {
                if(c is LinkButton)
                {
                    c.RenderControl(writer);
                    writer.RenderBeginTag(HtmlTextWriterTag.Br);
                }
            }
        }

        private void lb_Click(object sender, EventArgs e)
        {
            LinkButton lb = (LinkButton)sender;
            OnLinkClick(new LinkClickEventArgs(lb.Text, int.Parse(lb.CommandArgument)));
        }
    }
}
Avatar billede davidfossil Nybegynder
17. november 2004 - 23:21 #10
sådan!

nu tror jeg efterhånden jeg har fanget den :o)
i må meget gerne få points begge to - bare send et svar.

tak for hjælpen!
Avatar billede burningice Nybegynder
18. november 2004 - 11:26 #11
:) svar
Avatar billede davidfossil Nybegynder
22. november 2004 - 16:08 #12
snepnet - vil du have del i nogle points? ellers giver jeg dem til cyberfætter :o)
Avatar billede snepnet Nybegynder
22. november 2004 - 19:59 #13
øjs.... sorry ! - og tak for det :o)
mvh
Avatar billede davidfossil Nybegynder
25. november 2004 - 22:40 #14
lidt snyd, men i håb om at i to kloge hoveder stadig lytter med her :

http://www.eksperten.dk/spm/563928

jeg mangler virkelig et eller andet godt råd ... :)
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