Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

problem sa hvatanjem eventova koje baca dinamicki kreirana kontrola...

[es] :: .NET :: problem sa hvatanjem eventova koje baca dinamicki kreirana kontrola...

[ Pregleda: 3313 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Smireni Magnet
softver inzenjer

Član broj: 9520
Poruke: 81
*.crnagora.net.



Profil

icon problem sa hvatanjem eventova koje baca dinamicki kreirana kontrola...18.10.2005. u 12:56 - pre 197 meseci
Elem,

kreiram kontrolu A unutar neke metode koja se izvrsava nakon Page_Load. Za kontrolu A deklarisem event onClick. Posto se kontrola A (ocigledno) u postbacku ne generise, kako da omogucim handle-ovanje ovog event-a u postbacku?

Pozdrav,
SM


To me boxing is like a ballet, except
there is no choreography, no dancing and the dancers hit each other...
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+709 Profil

icon Re: problem sa hvatanjem eventova koje baca dinamicki kreirana kontrola...18.10.2005. u 13:00 - pre 197 meseci
Kao prvo, sve dinamičke kontrole treba da kreiraš u PageLoad, upravo da bi ti funkcionisao sistem ViewState-a. Takođe, u svakom postbacku treba (ponovo) da ih kreiraš, i navežeš im evente koje treba...
 
Odgovor na temu

majstor_01

Član broj: 60008
Poruke: 63
*.air.my-its.net.



Profil

icon Re: problem sa hvatanjem eventova koje baca dinamicki kreirana kontrola...18.10.2005. u 13:45 - pre 197 meseci
KOntrole moras da postavis u Page. OnInit da bi mogle da citaju ViewState, jer na Load, je state vec uvelio ucitan. (Vidi redosled dogadjaja na strani).

Podrav.
 
Odgovor na temu

Smireni Magnet
softver inzenjer

Član broj: 9520
Poruke: 81
*.crnagora.net.



Profil

icon Re: problem sa hvatanjem eventova koje baca dinamicki kreirana kontrola...18.10.2005. u 18:30 - pre 197 meseci
Citat:
jablan: Kao prvo, sve dinamičke kontrole treba da kreiraš u PageLoad, upravo da bi ti funkcionisao sistem ViewState-a. Takođe, u svakom postbacku treba (ponovo) da ih kreiraš, i navežeš im evente koje treba...


Ja zelim da formiram kontrolu kao rezultat eventa, a ne kao sastavni deo eventa.

Evo primera,
imam kontrolu koja pravi stablo i dugme "Dodaj novo". Klikom na dugme ja formiram unutar stabla textbox, dugme "Odustani" i "Prihvati" koje imaju svoje eventove. Kada pritisnem "Odustani", stablo mi se samo ponovo iscrta i tu ja u stvari ne moram nista da radim, ali ako pritisnem dugme "Prihvati", sadrzaj textboxa mi se unosi u bazu i iscrtava mi se kao child lista stabla koje je bilo selektovano.

Kako?


To me boxing is like a ballet, except
there is no choreography, no dancing and the dancers hit each other...
 
Odgovor na temu

majstor_01

Član broj: 60008
Poruke: 63
*.air.my-its.net.



Profil

icon Re: problem sa hvatanjem eventova koje baca dinamicki kreirana kontrola...18.10.2005. u 20:32 - pre 197 meseci
Vidis, da bi se izvrsio event, pre njega ide prvo OnInit, pa OnLoad, pa tek onda Event,
 
Odgovor na temu

Smireni Magnet
softver inzenjer

Član broj: 9520
Poruke: 81
*.crnagora.net.



Profil

icon Re: problem sa hvatanjem eventova koje baca dinamicki kreirana kontrola...19.10.2005. u 07:55 - pre 197 meseci
Citat:
majstor_01: Vidis, da bi se izvrsio event, pre njega ide prvo OnInit, pa OnLoad, pa tek onda Event,


Mogu da kazem da sam "kao" uspeo...

Stavio sam dugme i textbox na stranicu kontrole, postavio im visible=false, u Page.OnInit definisao event handler za dugme, a prilikom formiranja stabla, samo sam ove dve kontrole stavio na odgovarajuce mesto. Morao sam i da iskljucim EnableViewState za obe kontrole.

Dakle, nije bas onako kako ja zelim, s' obzirom da ove dve kontrole nisu dinamicki kreirane, vec se stalno ucitavaju, a samo kada mi trebaju postaju vidljive.

Bas mi i nije neko resenje, ja to volim da se uradi cisto, u rukavicama. Ako Micro$oft nije ponudio rukavice, ili ako ih bar ne mogu pronaci, onda moramo da radimo malo prljavo.

Ako znate za neko bolje resenje, ponudite ga, pa da raspravimo. Cini mi se da je ovo veoma bitna oblast za razjasnjenje, jer mnogima to predstavlja problem.

Ali, da ne gresim dusu, hvala i na dosadasnjim postovima, jer mi kontrola NAPOKON RADI i barem na klijentskoj strani izgleda kako treba!!!
To me boxing is like a ballet, except
there is no choreography, no dancing and the dancers hit each other...
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+709 Profil

icon Re: problem sa hvatanjem eventova koje baca dinamicki kreirana kontrola...19.10.2005. u 08:59 - pre 197 meseci
Citat:
Smireni Magnet: Ako Micro$oft nije ponudio rukavice, ili ako ih bar ne mogu pronaci

Postoji velika razlika između ova dva scenarija.
Citat:
Cini mi se da je ovo veoma bitna oblast za razjasnjenje, jer mnogima to predstavlja problem.

Slažem se.

Prostudiraj pažljivo sledeću veb formu:
Code:

<%@ Page language="c#" Codebehind="WebForm2.aspx.cs" AutoEventWireup="false"
 Inherits="WebApplication5.WebForm2" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
    <HEAD>
        <title>WebForm2</title>
        <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
        <meta name="CODE_LANGUAGE" Content="C#">
        <meta name="vs_defaultClientScript" content="JavaScript">
        <meta name="vs_targetSchema" 
            content="http://schemas.microsoft.com/intellisense/ie5">
    </HEAD>
    <body>
        <form id="Form1" method="post" runat="server">
            <P>
                <asp:PlaceHolder id="PlaceHolder1" 
                    runat="server"></asp:PlaceHolder></P>
            <P>
                <asp:Button id="ButtonDodaj" runat="server" 
                    Text="Dodaj"></asp:Button></P>
            <P>
                <asp:Button id="ButtonPrihvati" runat="server" 
                    Text="Prihvati"></asp:Button></P>
            <P>
                <asp:Label id="Label1" runat="server"></asp:Label></P>
        </form>
    </body>
</HTML>

I codebehind iste:
Code:

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 WebApplication5
{
    /// <summary>
    /// Summary description for WebForm2.
    /// </summary>
    public class WebForm2 : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.Button ButtonDodaj;
        protected System.Web.UI.WebControls.PlaceHolder PlaceHolder1;
        protected System.Web.UI.WebControls.Label Label1;
        protected System.Web.UI.WebControls.Button ButtonPrihvati;

        protected ArrayList Al 
        {
            get 
            {
                ArrayList al;
                if (Session["al"] == null) 
                {
                    al = new ArrayList();
                    Session["al"] = al;
                } 
                else 
                {
                    al = (ArrayList)Session["al"];
                }

                return al;
            }
        }
    
        private void Page_Load(object sender, System.EventArgs e)
        {
            // Put user code to initialize the page here
            foreach (Control c in Al) 
            {
                PlaceHolder1.Controls.Add(c);
            }
        }

        #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.ButtonDodaj.Click += 
                new System.EventHandler(this.ButtonDodaj_Click);
            this.ButtonPrihvati.Click += new 
                System.EventHandler(this.ButtonPrihvati_Click);
            this.Load += new System.EventHandler(this.Page_Load);

        }
        #endregion

        private void ButtonDodaj_Click(object sender, System.EventArgs e)
        {
            TextBox tb = new TextBox();
            tb.ID = "tb" + Al.Count.ToString();

            Al.Add(tb);
        
            PlaceHolder1.Controls.Add(tb);
        }

        private void ButtonPrihvati_Click(object sender, System.EventArgs e)
        {
            Label1.Text = "";
            foreach (TextBox tb in Al) 
            {
                Label1.Text += tb.Text;
            }
        }
    }
}



[Ovu poruku je menjao jablan dana 19.10.2005. u 10:03 GMT+1]
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+709 Profil

icon Re: problem sa hvatanjem eventova koje baca dinamicki kreirana kontrola...19.10.2005. u 10:38 - pre 197 meseci
Sad videh da si pominjao navezivanje eventova na dinamički kreirane kontrole... Može i to:
Code:
<%@ Page language="c#" Codebehind="WebForm2.aspx.cs" 
AutoEventWireup="false" Inherits="WebApplication5.WebForm2" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
    <HEAD>
        <title>WebForm2</title>
        <meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
        <meta content="C#" name="CODE_LANGUAGE">
        <meta content="JavaScript" name="vs_defaultClientScript">
        <meta content="http://schemas.microsoft.com/intellisense/ie5"
 name="vs_targetSchema">
    </HEAD>
    <body>
        <form id="Form1" method="post" runat="server">
            <P><asp:placeholder id="PlaceHolder1" 
runat="server"></asp:placeholder></P>
            <P><asp:button id="ButtonDodaj" runat="server" 
Text="Dodaj"></asp:button></P>
            <P><asp:label id="Label1" runat="server"></asp:label></P>
        </form>
    </body>
</HTML>

i codebehind
Code:
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 WebApplication5
{
    /// <summary>
    /// Summary description for WebForm2.
    /// </summary>
    public class WebForm2 : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.Button ButtonDodaj;
        protected System.Web.UI.WebControls.PlaceHolder PlaceHolder1;
        protected System.Web.UI.WebControls.Label Label1;

        protected ArrayList Al 
        {
            get 
            {
                ArrayList al;
                if (Session["al"] == null) 
                {
                    al = new ArrayList();
                    Session["al"] = al;
                } 
                else 
                {
                    al = (ArrayList)Session["al"];
                }

                return al;
            }
        }
    
        private void Page_Load(object sender, System.EventArgs e)
        {
            // Put user code to initialize the page here

            foreach (Control c in Al) 
            {
                if (c is Button)
                    ((Button)c).Click += new EventHandler(b_Click);
                PlaceHolder1.Controls.Add(c);
            }
        }

        #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.ButtonDodaj.Click += 
                new System.EventHandler(this.ButtonDodaj_Click);
            this.Load += new System.EventHandler(this.Page_Load);
        }
        #endregion

        private void ButtonDodaj_Click(object sender, System.EventArgs e)
        {
            TextBox tb = new TextBox();
            string tbid = "tb" + Al.Count.ToString();
            tb.ID = tbid;
            Al.Add(tb);

            Button b = new Button();
            b.Text = "Prihvati";
            b.Attributes.Add("tbid", tbid);
            b.ID = "b" + Al.Count.ToString();
//            b.Click += new EventHandler(b_Click);
            Al.Add(b);

            PlaceHolder1.Controls.Add(tb);
            PlaceHolder1.Controls.Add(b);
        }

        private void b_Click(object sender, EventArgs e)
        {
            Button b = (Button)sender;

            TextBox tb = (TextBox) 
                PlaceHolder1.FindControl(b.Attributes["tbid"]);

            if (tb != null)
                Label1.Text = tb.Text;
        }
    
    }
}


[Ovu poruku je menjao jablan dana 19.10.2005. u 11:38 GMT+1]
 
Odgovor na temu

Smireni Magnet
softver inzenjer

Član broj: 9520
Poruke: 81
*.crnagora.net.



Profil

icon Re: problem sa hvatanjem eventova koje baca dinamicki kreirana kontrola...24.10.2005. u 12:22 - pre 197 meseci
Ovo parce koda sto si poslao sam analizirao jos pre nekoliko dana, ali ne stigoh da ga prokomentarisem.

Moram da kazem samo jedno: mnogo mi se svidja resenje.

Posto se meni ovaj problem javlja najcesce kada se neka dinamicki kreirana kontrola pojavljuje samo jednom, da bi nakon reagovanja na event ona bila uklonjena, malo sam izmenio tvoj kod da bi i to moglo da se radi. Mislim da bi i ovo bilo bitno za ljude koji se bore sa ovim problemom. E, da- ja više nemam problema.

Izmena je veoma jednostavna. Naime, dugme i njegov odgovarajuci textbox se brisu iz arraylist-e u toku obrade event-a.

Moj dodatak su poslednja dva reda koda.
Code:

        private void b_Click(object sender, EventArgs e)
        {
            Button b = (Button)sender;

            TextBox tb = (TextBox) 
                PlaceHolder1.FindControl(b.Attributes["tbid"]);

            if (tb != null)
                Label1.Text = tb.Text;

            Al.Remove(sender);
            Al.Remove(PlaceHolder1.FindControl(b.Attributes["tbid"]));
        }


Nakon startovanja ovog koda, pritiskom na Button se formira textbox i button. Nakon unosa sadrzaja u textbox i klikom na button, labela ispod se puni sadrzajem textboxa, iz arrayliste se brisu ove dve kontrole, tako da se na ekranu nalazi samo pocetni Button i popunjena labela.

Ako je neko ovo shvatio, blago njemu...

Pozdrav,
SM


To me boxing is like a ballet, except
there is no choreography, no dancing and the dancers hit each other...
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+709 Profil

icon Re: problem sa hvatanjem eventova koje baca dinamicki kreirana kontrola...24.10.2005. u 13:59 - pre 197 meseci
Smireni, ako već imaš samo jedno dinamičko dugme i tekst polje, nema potrebe za ArrayListom (pa ni za pamćenjem ID-ja u atributu). Samo napravi jednu protected promenljivu tipa Button i jednu TextBox i u njima drži generisane kontrole. Kad izvršiš event, samo ih skloni iz kontejnera (placeholdera) i to je to. Kood je onda dosta jednostavniji.
 
Odgovor na temu

Smireni Magnet
softver inzenjer

Član broj: 9520
Poruke: 81
*.crnagora.net.



Profil

icon Re: problem sa hvatanjem eventova koje baca dinamicki kreirana kontrola...25.10.2005. u 06:29 - pre 197 meseci
Jasno,

ali kada sam stavio ovaj kod, imao sam na umu situaciju u kojoj imam više različitih user controla, koje ipak zauzimaju više memorije od jednog buttona i textboxa, a koje se naizmenično pojavljuju na jednoj strani, tj onako kako ja to želim. Ipak, držati ih sve kao protected, a imam ih recimo pet, pa ih stavljati u placeholder i uklanjati, baš i nisam siguran koliko je to praktično. Praktično je sa strane pisanja koda, ali gledano iz ugla korišćenja resursa, nisam baš siguran.

Jablane, zanimao bi me tvoj komentar po tom pitanju

Pozdrav,
SM
To me boxing is like a ballet, except
there is no choreography, no dancing and the dancers hit each other...
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+709 Profil

icon Re: problem sa hvatanjem eventova koje baca dinamicki kreirana kontrola...25.10.2005. u 08:07 - pre 197 meseci
Ako deklarišeš recimo protected Button btn1 u kodu, to dugme još ne postoji, to jest, samo je rezervisana memorija za referencu (pointer) na njega. Tek kada uradiš new, u memoriji se stvarno instancira jedno dugme.

ArrayList je praktično lista referenci na bilo šta, što znači da osim same reference na Button, u ArrayListu ima i neke pomoćne memorije alocirane koja služi za to da se lista drži povezana, da može da se indeksira, itd.

U tom smislu, manje se resursa troši ako imaš po referencu za svaku kontrolu koja ti treba (prvo rešenje).

Takođe, prvo rešenje je i manje podložno greškama, pošto se, kad radiš sa deklarisanim tipiziranim referencama, ne radi up- i down-castovanje, koje može prouzrokovati runtime greške vezane sa konverzijom u pogrešni tip.

[Ovu poruku je menjao jablan dana 25.10.2005. u 09:08 GMT+1]
 
Odgovor na temu

[es] :: .NET :: problem sa hvatanjem eventova koje baca dinamicki kreirana kontrola...

[ Pregleda: 3313 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.