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

Unistavanje kontrola sa Forme

[es] :: .NET :: Unistavanje kontrola sa Forme

[ Pregleda: 5005 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

boomLM
Misa Boom

Član broj: 96472
Poruke: 85
*.smin.sezampro.yu.



Profil

icon Unistavanje kontrola sa Forme04.03.2007. u 16:39 - pre 178 meseci
Na formu sam nabacio par kontrola (pictureBox,Button,...) i sada pokusavam da ih smaknem sa te forme-da ih unistim tj. kontrola.Dispose()
ali tu nastaje problem...
Code:
private void button1_Click(object sender, System.EventArgs e)
        {
            int b=0;
            foreach(System.Windows.Forms.Control kontrola in this.Controls)
            {
                b+=1;
                
                kontrola.Dispose();
                                
                //MessageBox.Show(kontrola.Name+","+b.ToString());
                                    
            }
        }

Kada umesto kontrola.Dispose() (u foreach petlji) pozovem MessageBox.Show(kontrola.Name+","+b.ToString()); aplikacija radi ocekivano tj. prijavljuje mi redom imena kontrola i redni broj, ali kada pozovem kontrola.Dispose() UNIŠTI MI SVAKU DRUGU KONTROLU I ZATIM ZAMRZNE APLKIKACIJU. Greska koju generise kaze "Object reference not set to an instance of an object." ???????

NE RAZUMEM !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

??????????????????????????????????????????????????????????????????????????????????????

 
Odgovor na temu

aleksandarpopov
IT consultant
Senta

Član broj: 57172
Poruke: 484
*.sksyu.net.

Sajt: www.linkedin.com/in/aleks..


Profil

icon Re: Unistavanje kontrola sa Forme04.03.2007. u 17:03 - pre 178 meseci
??!? Pa ti hoces da pristupis proprety-ju objekta koji si upravo unistio. Stavi taj messagebox.show pre poziva dispose.
RTFM
 
Odgovor na temu

boomLM
Misa Boom

Član broj: 96472
Poruke: 85
*.smin.sezampro.yu.



Profil

icon Re: Unistavanje kontrola sa Forme04.03.2007. u 17:13 - pre 178 meseci
Pa nije bas tako lako :))))

Pogledaj... MessageBox je pod komentarom! Njega sam naveo kao primer da radi sve kako valja samo ako se objekat neunistava... umesto kontrola.Dispose() mogu dfa stavim kontrola.Hide() i radice... ali nece sa kontrola.Dispose() ???????
 
Odgovor na temu

CallMeSaMaster

Član broj: 43611
Poruke: 466
89.111.255.*



+1 Profil

icon Re: Unistavanje kontrola sa Forme04.03.2007. u 17:47 - pre 178 meseci
Pa dobro to jest komentar, to je jasno, ali kako onda dodas formu.Moras skloniti komentar zar ne? Kad ga maknes imas onda ono sto ti Aleksandar kaze...
 
Odgovor na temu

aleksandarpopov
IT consultant
Senta

Član broj: 57172
Poruke: 484
*.sksyu.net.

Sajt: www.linkedin.com/in/aleks..


Profil

icon Re: Unistavanje kontrola sa Forme04.03.2007. u 17:53 - pre 178 meseci
Hide() ne unistava objekat, vec ga samo pravi "nevidljivim" za usera. Dispose ga "unistava".
RTFM
 
Odgovor na temu

boomLM
Misa Boom

Član broj: 96472
Poruke: 85
*.smin.sezampro.yu.



Profil

icon Re: Unistavanje kontrola sa Forme04.03.2007. u 17:55 - pre 178 meseci
LJUDI...
private void button1_Click(object sender, System.EventArgs e)
{
foreach(System.Windows.Forms.Control kontrola in this.Controls)
{

kontrola.Dispose();

}
}

Komentar mi ni ne treba.... Njega sam stavio da vidim da li foreach radi kako treba tj. da li posecuje kontrolu po kontrolu !!! I to i radi ! Ali kada krenem da unistim kontrolu (kontrole 1 po 1 kroz petlju) pukne mi aplikacija !!!!
Zasto ne unistava kontrolu za kontrolom...

Mozda ja nisam najbolje shvatio sta vi govorite pa vas molim da mi pojasnite. Ali ni ovaj deo koda nece da radi!
Sve ostalo radi... i kontrola.Hide() i kontrola.Location(x,y) i ... ali kontrola.Dispose() NECE
 
Odgovor na temu

boomLM
Misa Boom

Član broj: 96472
Poruke: 85
*.smin.sezampro.yu.



Profil

icon Re: Unistavanje kontrola sa Forme04.03.2007. u 17:57 - pre 178 meseci

private void button1_Click(object sender, System.EventArgs e)
{
foreach(System.Windows.Forms.Control kontrola in this.Controls)
{

kontrola.Dispose();

}
}

Znaci ni ovo ne radi !!!
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 898
*.sksyu.net.



+171 Profil

icon Re: Unistavanje kontrola sa Forme04.03.2007. u 18:51 - pre 178 meseci
Cekaj malo, ne mozes tako da radis.

Prvo pogledaj kako radi foreach

Code:

                foreach (ElementType element in collection) statement
                ----------------------------------------------------


        Enumerator enumerator = (collection).GetEnumerator(); 
        try { 
            while (enumerator.MoveNext()) { 
                ElementType element = (ElementType)enumerator.Current; 
                statement;
            } 
        } 
        finally { 
            IDisposable disposable = enumerator as System.IDisposable;
            if (disposable != null) disposable.Dispose(); 39
        }



Znaci malo komplikovaniji while, koji da nema foreach, bi u sustini svaki put morao sam da pises istu konstrukciju. Problem lezi u tome kada pozoves Dispose metodu nad kontrolom ona sebe brise iz parent kolekcije kontrola. Pogledaj Dispose za Control u Refelctoru, imas deo koda
Code:

       if (this.parent != null)
                {
                    this.parent.Controls.Remove(this);
                }


Znaci ako imas recimo tri kontrole

1 Button
2 TextBox
3 ListBox

Kada krenes sa iteracijom, tebi ce se obrisati prvo Button, pa zatim ListBox, dok ce ti TextBox ostati u kolekciji, zbog toga sto ti menjas kolekciju dok prolazis kroz nju.
Sad, drugi problem je do greske koju dobijas, ne znam kako si poredjao kontrole i sta radis sa njima pa zato ne bi bilo lose da ostavis ceo kod, znaci i ceo onaj InitializeComponent. Jedan od mogucih problema je taj sto prilikom poziva Dispose kontrola u samoj Dispose konstrukciji, moguce je da nesto referencira na nesto sto je vec dispozovano :). Generalno postoji pravilo da Dispose niko ne treba do poziva osim onoga koji je kreirao objekat. Mada ovo sa kontrolama nije pravilo.

Da te pitam nesto. Ako vec cistis kolekciju zar nije lakse pozvati this.Controls.Clear(); ili sa

Code:

            while (true)
            {
                // ovde neki tvoj uslov
                if (this.Controls.Count == 0)
                    break;
                
                this.Controls.RemoveAt(0);                
            }

 
Odgovor na temu

aleksandarpopov
IT consultant
Senta

Član broj: 57172
Poruke: 484
*.sksyu.net.

Sajt: www.linkedin.com/in/aleks..


Profil

icon Re: Unistavanje kontrola sa Forme04.03.2007. u 18:57 - pre 178 meseci
Stavi taj isti kod u FormLoad pa ces videti da radi. Verovatno ti ne radi zato sto kako prolazi kroz foreach pre dodje do dugmeta na koje ti je vezan taj event gde pozivas taj foreach, nego ostale kontrole.
Pozdrav!

RTFM
 
Odgovor na temu

boomLM
Misa Boom

Član broj: 96472
Poruke: 85
*.smin.sezampro.yu.



Profil

icon Re: Unistavanje kontrola sa Forme04.03.2007. u 22:47 - pre 178 meseci
Citat:
Da te pitam nesto. Ako vec cistis kolekciju zar nije lakse pozvati this.Controls.Clear();

Jeste ali kontrole treba da nestaju jedna po jedna

Hvala za uput... mnogo mi znači.
Izgleda da ću morati malo da pretrazim po MSDNu na pocetku mi se cinilo jednostavnije...

tnx
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12800



+4740 Profil

icon Re: Unistavanje kontrola sa Forme05.03.2007. u 12:00 - pre 178 meseci
Pa, kod ovog sto je dao negyxo ce kontrole nestajati jedna po jedna (mada ta se razlika ne bi ni videla ako ne stavis neku pauzu:
Code:
while (true)
            {
                // ovde neki tvoj uslov
                if (this.Controls.Count == 0)
                    break;
                
                this.Controls.RemoveAt(0);                
            }


Mada to moze i jednostavnije:
Code:

while (this.Controls.Count > 0)
    {
    this.Controls.RemoveAt(0);                
     }

 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6021



+4620 Profil

icon Re: Unistavanje kontrola sa Forme05.03.2007. u 12:40 - pre 178 meseci
Citat:
Shadowed
Mada to moze i jednostavnije:
Code:

while (this.Controls.Count > 0)
    {
    this.Controls.RemoveAt(0);                
     }


Postoji mali problemcic sa svim ovim. RemoveAt uklanja element iz kolekcije, ali ga ne unistava, a posto form kontrole pravljene u dizajneru uvek imaju eksponirano polje na samoj formi, ostaje ziva referenca i GC nece automatski pokupiti i disposovati kontrole, tj nece ih unistiti. Dobije se isti efekat kao da si sve kontrole postavio visible=false


Znaci mora i RemoveAt i Dispose


Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

aleksandarpopov
IT consultant
Senta

Član broj: 57172
Poruke: 484
*.sksyu.net.

Sajt: www.linkedin.com/in/aleks..


Profil

icon Re: Unistavanje kontrola sa Forme05.03.2007. u 13:26 - pre 178 meseci
Citat:
Znaci mora i RemoveAt i Dispose

A bez RemoveAt i samo Dispose?
RTFM
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 898
*.sksyu.net.



+171 Profil

icon Re: Unistavanje kontrola sa Forme05.03.2007. u 13:49 - pre 178 meseci
OffTopic:Zna li neko sta se desava sa ES-om, kod mene je sad sve pobelilo

OnTopic:
Pa u sustini, Dispose ce pozvati Remove parenta tako da bi mogao da ga izostavis ali nekako je elegantnije da pozoves i Remove, cisto da se vidi sta radis, mozes nekad imati slucaj da stavljas kontrolu u neku drugu kolekciju/listu/niz od one parent.ControlsCollection, recimo List<Control>, pa se posle zaboravis

Citat:
mmix:
Postoji mali problemcic sa svim ovim. RemoveAt uklanja element iz kolekcije, ali ga ne unistava, a posto form kontrole pravljene u dizajneru uvek imaju eksponirano polje na samoj formi, ostaje ziva referenca i GC nece automatski pokupiti i disposovati kontrole, tj nece ih unistiti. Dobije se isti efekat kao da si sve kontrole postavio visible=false


Da to je tacno, zaboravio sam da on zeli i da ih unisti, mada postoji slucaj ako sve kontrole generise rucno i ostavlja reference samo u kolekciji onda ce kontrole biti unistene ali malo duze ce ziveti u GC-u ali u svakom slucaju Dispose treba pozvati kada se radi totalno ciscenje.

Citat:
Shadowed:
Mada to moze i jednostavnije:
Code:

while (this.Controls.Count > 0)
    {
    this.Controls.RemoveAt(0);                
     }


Pa u sustini moze, ali ostavio sam onaj primer za slucaj da zeli odredjene slucajeve da uklanja iz kolekcije.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6021



+4620 Profil

icon Re: Unistavanje kontrola sa Forme05.03.2007. u 14:21 - pre 178 meseci
Citat:
aleksandarpopov: A bez RemoveAt i samo Dispose?


Moze, ali ne kroz foreach ili bilo koju drugu primenu iteratora. Mislim da mozes npr. kroz while petlju, mada ako imas kontrolu koja ima svoju dispose implemetnaciju koja ne poziva baznu implementaciju i ne ukloni sebe iz parenta onda si ugasio :), ode u mrtvu petlju

Code:

while (Controls.Count > 0) Controls[0].Dispose();

Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

aleksandarpopov
IT consultant
Senta

Član broj: 57172
Poruke: 484
*.sksyu.net.

Sajt: www.linkedin.com/in/aleks..


Profil

icon Re: Unistavanje kontrola sa Forme05.03.2007. u 16:04 - pre 178 meseci
Ok, thx!

RTFM
 
Odgovor na temu

[es] :: .NET :: Unistavanje kontrola sa Forme

[ Pregleda: 5005 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

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