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

Unistavanje kontrola sa Forme

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

[ Pregleda: 1547 | Odgovora: 15 ]

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

boomLM
Misa Boom

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



Profil

icon Unistavanje kontrola sa Forme04.03.2007. u 16:39

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 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

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

04.03.2007. u 16:39 

aleksandarpopov
Software developer
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
??!? Pa ti hoces da pristupis proprety-ju objekta koji si upravo unistio. Stavi taj messagebox.show pre poziva dispose.
RTFM
04.03.2007. u 17:03 

boomLM
Misa Boom

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



Profil

icon Re: Unistavanje kontrola sa Forme04.03.2007. u 17:13
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() ???????
04.03.2007. u 17:13 

CallMeSaMaster
Sarajevo

Član broj: 43611
Poruke: 403
89.111.255.*



Profil

icon Re: Unistavanje kontrola sa Forme04.03.2007. u 17:47
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...
04.03.2007. u 17:47 

aleksandarpopov
Software developer
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
Hide() ne unistava objekat, vec ga samo pravi "nevidljivim" za usera. Dispose ga "unistava".
RTFM
04.03.2007. u 17:53 

boomLM
Misa Boom

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



Profil

icon Re: Unistavanje kontrola sa Forme04.03.2007. u 17:55
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
04.03.2007. u 17:55 

boomLM
Misa Boom

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



Profil

icon Re: Unistavanje kontrola sa Forme04.03.2007. u 17:57

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 !!!
04.03.2007. u 17:57 

negyxo
Aleksandar Perkuchin
Novi Sad

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



Profil

icon Re: Unistavanje kontrola sa Forme04.03.2007. u 18:51
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);                
            }


Only Time Will Tell
04.03.2007. u 18:51 

aleksandarpopov
Software developer
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
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
04.03.2007. u 18:57 

boomLM
Misa Boom

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



Profil

icon Re: Unistavanje kontrola sa Forme04.03.2007. u 22:47
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
04.03.2007. u 22:47 

Shadowed

SuperModerator
Član broj: 649
Poruke: 9397
*.migcomputers.co.yu.



Profil

icon Re: Unistavanje kontrola sa Forme05.03.2007. u 12:00
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);                
     }

05.03.2007. u 12:00 

mmix
Miljan Mitrovic
Software Architect
Pancevo, Srbija

SuperModerator
Član broj: 17944
Poruke: 2958
*.logic.bm.

Sajt: blog.mitrovic.rs


Profil

icon Re: Unistavanje kontrola sa Forme05.03.2007. u 12:40
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


▪ I don't use cocaine, heroin, facebook nor twitter. You can be strong too, just say NO to mind altering drugs
▪ The functional programmer sounds rather like a medieval monk, denying himself the pleasures of life in the hope that it will make him virtuous - John Hughes
▪ Fallacies do not cease to be fallacies because they become fashions - G. K. Chesterton
05.03.2007. u 12:40 

aleksandarpopov
Software developer
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
Citat:
Znaci mora i RemoveAt i Dispose

A bez RemoveAt i samo Dispose?
RTFM
05.03.2007. u 13:26 

negyxo
Aleksandar Perkuchin
Novi Sad

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



Profil

icon Re: Unistavanje kontrola sa Forme05.03.2007. u 13:49
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.
Only Time Will Tell
05.03.2007. u 13:49 

mmix
Miljan Mitrovic
Software Architect
Pancevo, Srbija

SuperModerator
Član broj: 17944
Poruke: 2958
*.logic.bm.

Sajt: blog.mitrovic.rs


Profil

icon Re: Unistavanje kontrola sa Forme05.03.2007. u 14:21
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();

▪ I don't use cocaine, heroin, facebook nor twitter. You can be strong too, just say NO to mind altering drugs
▪ The functional programmer sounds rather like a medieval monk, denying himself the pleasures of life in the hope that it will make him virtuous - John Hughes
▪ Fallacies do not cease to be fallacies because they become fashions - G. K. Chesterton
05.03.2007. u 14:21 

aleksandarpopov
Software developer
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
Ok, thx!

RTFM
05.03.2007. u 16:04 

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

[ Pregleda: 1547 | Odgovora: 15 ]

Postavi temu Odgovori

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