Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 15 odgovora
  • 8.362 pregleda

Najnovija ↓

Unistavanje kontrola sa Forme 04.03.2007. u 17:39 · pre 239 meseci #1
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 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

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

Re: Unistavanje kontrola sa Forme 04.03.2007. u 18:13 · pre 239 meseci #3
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() ???????
Re: Unistavanje kontrola sa Forme 04.03.2007. u 18:47 · pre 239 meseci #4
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...
Re: Unistavanje kontrola sa Forme 04.03.2007. u 18:55 · pre 239 meseci #6
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
Re: Unistavanje kontrola sa Forme 04.03.2007. u 18:57 · pre 239 meseci #7

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 !!!
Re: Unistavanje kontrola sa Forme 04.03.2007. u 19:51 · pre 239 meseci #8
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);                
            }

Re: Unistavanje kontrola sa Forme 04.03.2007. u 19:57 · pre 239 meseci #9
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!
Potpis
RTFM
Re: Unistavanje kontrola sa Forme 04.03.2007. u 23:47 · pre 239 meseci #10
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
Re: Unistavanje kontrola sa Forme 05.03.2007. u 13:00 · pre 239 meseci #11
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);                
     }
Potpis
Nebojsa Milanovic:
-Trumpa smatram vrhunskim predsednikom i voleo bih da živim u državi na čijem je on čelu
-Rusija ne laže, ne vodi osvajačke ratove
-Trump je svetla tačka u USA blatu
-Elon Musk, možda najpametniji i najtrezveniji Amerikanac
Re: Unistavanje kontrola sa Forme 05.03.2007. u 13:40 · pre 239 meseci #12
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

Potpis
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ć
Re: Unistavanje kontrola sa Forme 05.03.2007. u 14:49 · pre 239 meseci #14
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.
Re: Unistavanje kontrola sa Forme 05.03.2007. u 15:21 · pre 239 meseci #15
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();
Potpis
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ć
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme