Avatar billede willowwillow Nybegynder
12. september 2003 - 10:24 Der er 4 kommentarer og
1 løsning

dynamiske knapper igen

Mit problem er at jeg gerne vil lave dynamiske events uden for Page_Load. Jeg spurgte til det i et tidligere indlæg og fik svar, men min hjerne kunne ikke helt forstå det alligevel.

Har følgende kode... nogen som kan forklare mig hvad jeg skal gøre for at fange events på de "dynamiske" knapper. :

aspx start_______________________________________
    <form id="Form1" method="post" runat="server">
            <asp:DropDownList id="DropDownList1" style="Z-INDEX: 101; LEFT: 321px; POSITION: absolute; TOP: 189px"
                runat="server" AutoPostBack="True">
                <asp:ListItem Value="0">Ingenting</asp:ListItem>
                <asp:ListItem Value="1">noget</asp:ListItem>
            </asp:DropDownList>
            <asp:Panel id="Panel1" style="Z-INDEX: 102; LEFT: 444px; POSITION: absolute; TOP: 304px" runat="server">Panel</asp:Panel>
        </form>

aspx slut_______________________________________

cs start_______________________________________


public class testevent : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.Panel Panel1;
        protected System.Web.UI.WebControls.DropDownList DropDownList1;
   
        private void Page_Load(object sender, System.EventArgs e)
        {
            // Put user code to initialize the page here
        }

        #region Web Form Designer generated code
        override protected void OnInit(EventArgs e)
        {
            //
            // CODEGEN: This call is required by the ASP.NET Web Form Designer.
            //
            InitializeComponent();
            base.OnInit(e);
        }
       
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {   
            this.DropDownList1.SelectedIndexChanged += new System.EventHandler(this.DropDownList1_SelectedIndexChanged);
            this.Load += new System.EventHandler(this.Page_Load);
        }
        #endregion

        private void DropDownList1_SelectedIndexChanged(object sender, System.EventArgs e)
        {
            mineKnapper();
       
        }

        public void mineKnapper()
        {
       
            int x = 6;
            for (int i = 0;i<=x;i++)
            {
                LinkButton myBut = new LinkButton();
                myBut.ID = ""+i;
                myBut.Text = "knap nr "+i;
                myBut.CommandName = "navn = "+i;
                myBut.Command +=new CommandEventHandler(myBut_Command);
                Panel1.Controls.Add(myBut);
            }
        }

        private void myBut_Command(object sender, CommandEventArgs e)
        {
            Response.Write(e.CommandName.ToString());
        }
    }

cs slut_______________________________________

???
På forhånd takker..
Avatar billede roger Nybegynder
12. september 2003 - 18:18 #1
Hej igen willowwillow :)

Du kan ikke fange events uden også at loade controls ved postbacks.

Min løsning var at oprette en EventRelay http://www.aspalliance.com/mamanze/articles/default.aspx?p=EventRelay

Disse objekter er blot relays for dine dynamiske knapper. Dvs. i realiteten behøver du kun 1 objekt, da kun 1 knap trykkes.

protected EventRelay buttonRelay; //EventRelay klassen fra ovenstående link som datatype

private void InitializeComponent(){
  buttonRelay = new EventRelay("buttonRelay");
  buttonRelay.Raised+=new EventRelay.RaisedEventHandler(DynamicButtonEvent_Raised);
  Controls.Add(buttonRelay); <--- Her ligger hele dit problem faktisk - Dine dynamiske knapper findes nemlig ikke i Control hierakiet og events bliver derfor ikke "fired", men det gør buttonRelay nu hver gang.
}

private void DynamicButtonEvent_Raised(string arg){
    Response.Write("Følgende knap blev klikket: "+arg);
}


public void mineKnapper(){
       
int x = 6;
  for (int i=0;i<=x;i++){
    LinkButton myBut = new LinkButton(); //en alm HtmlButton ville være fint
    myBut.Attributes.Add("onclick",this.GetPostBackEventReference(buttonRelay,"knap"+i));
    Panel1.Controls.Add(myBut);
  }
}


Jeg har ikke testet eksemplet, men det burde virke hvis jeg ikke har overset noget :)

Det er dog forudsat af at du benytter klassen "EventRelay" fra ovenstående link.

Håber du kan få det til at spille nu, ellers post igen.
Avatar billede willowwillow Nybegynder
15. september 2003 - 15:12 #2
Jeg benytter mig nu af den anbefalet klasse (http://www.aspalliance.com/mamanze/samples/?path=eventrelay.cs), men jeg få en fejl og kan ikke helt hitte ud af det.

Mit problem er at følgende:

buttonRelay = new EventRelay("buttonRelay");
  buttonRelay.Raised+=new EventRelay.RaisedEventHandler(DynamicButtonEvent_Raised);

den siger at RaisedEventHandler ikke eksistere i den klassen, det gør den som sådan heller ikke, men den bliver dog delegeret lige udenfor klassen :

public delegate void RaisedEventHandler(System.String Argument);

Men inde i klassen oprettes Raised af typen RaisedEventHandler:

public event RaisedEventHandler Raised;

Er det rigtigt forstået at man tvinger et event til at postback, og i dette tilfælde knytter myBut til den initiliaseret buttonRelay...?

Men kan du fortælle mig hvad den evt fejl kunne være ?

På forhånd mange tak :-)
Avatar billede roger Nybegynder
15. september 2003 - 19:01 #3
Sorry, min fejl....ovenstående eksempel er afhængig af at delegaten er deklareret inde i klassen.

Ja du tvinger dine knapper til at lave postbacks ved onclick.

this.GetPostBackEventReference(buttonRelay,"knap"+i));

ASP.NET runtime genererer selv client kode. Alt hvad du skal fortælle er hvilken Control der skal have besked ved postback incl. arguments. I dette tilfælde er det din buttonRelay, og "knap"+i.

Klassen EventRelay implementerer interfacet System.Web.UI.IPostBackEventHandler, og dermed metoden  void RaisePostBackEvent(System.String EventArgument). Ved postback kaldes denne metode af ASP.NET runtime, og din event raises -->

(fra klassen EventRelay)
    public void RaisePostBackEvent(System.String EventArgument) {
        this.OnRaised(EventArgument);
    }

    public event RaisedEventHandler Raised;

    public void OnRaised(System.String Argument) {
        if(Raised != null)
            Raised(Argument); <--- her
    }

Dernæst "delegeres" der videre til den metode du selv har defineret:

private void DynamicButtonEvent_Raised(string arg){
    Response.Write("Følgende knap blev klikket: "+arg);
}


Håber jeg fik forklaret det nogenlunde.
Avatar billede willowwillow Nybegynder
16. september 2003 - 09:42 #4
Det gav lidt mening, tak :-)

Det er lidt tricky, det med dynamiske events, men det er en god ting at kunne.
Men hvad så hvis man vil have flere attributter med sig, ligesom et command event har.
Så opretter jeg vel bare nogle flere variabler i construcoren i eventrelay klassen går jeg ud fra...

Og kan du anbefale en bog ? :-)

OG så lige en sidste ting, før jeg fik det til at virke, så skulle onclick attributten ændres til href, dvs :

myBut.Attributes.Add("href","java script:"+this.GetPostBackEventReference(buttonRelay,"knap"+i));

istedet for:

myBut.Attributes.Add("onclick",this.GetPostBackEventReference(buttonRelay,"knap"+i));

Jeg takker for hjælpen :-)
Avatar billede roger Nybegynder
20. september 2003 - 14:38 #5
Hvis du vil have flere argumenter kunne du jo bare seperere dine argumenter, feks. "arg1,arg2,arg3" og dermed behandle dem ved postback.

Mht. en bog, så købte jeg selv for ikke sålænge siden denne:
http://www.amazon.com/exec/obidos/tg/detail/-/0735615829/103-7578804-9452626?v=glance

Har desværre ikke haft tid til at læse så meget i den, men den ser ok ud.

onclick burde efter min overbevisniung virke, men hvis du bruger href, så kunne du ændre

myBut.Attributes.Add("href","java script:"+this.GetPostBackEventReference(buttonRelay,"knap"+i));

kan du ændre til:

myBut.Attributes.Add("href",this.GetPostBackClientHyperlink(buttonRelay,"knap"+i));

Så tilføjer asp.net runtime selv java script:
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