Oppure

Loading
14/10/15 14:29
lupetto77
Nel Form1 ho un panel con all'interno varie pictureBox (sono quelle in cui le immagini devono caricarsi) e altre pictureBox nel Form1 dove non devono essere caricate.

Il problema è che le immagini vengono caricate proprio nelle pictureBox al di fuori del panel.

Come potrei risolvere?

Grazie Thejuster per l'aiuto :k:
aaa
14/10/15 15:22
lupetto77
Mi sono accorto che se le pictureBox si trovano nel panel il codice che usavo prima non funzionava e dava un errore, mentre se spostavo le pictureBox nel Form il codice funzionava benessimo.
Il codice era questo:
for (int immagine = 0; immagine < imageList1.Images.Count; immagine++)
            {
                (Controls["pictureBox" + (2 + immagine).ToString()] as PictureBox).Image = imageList1.Images[immagine];
            }

E le immagini vengono caricate tutte in ordine corretto.


Con il tuo codice mi carica le immagini nelle pictureBox fuori il panel come ti ho scritto nel messaggio che ho postato prima.

Però se le sposto fuori carica tutte le immagini però in ordine sbagliato.

Però se si riesce a risolvere il problema del panel è meglio, ai consigli?
aaa
14/10/15 16:11
Thejuster
La soluzione e proprio sotto al tuo naso lupetto.

Quel codice che hai mostrato, come detto prima.

Non ho detto che non funziona, ma è un metodo molto rozzo.

Identificare l'oggetto come tipo è una cosa molto più professionale e leggibile da parte
anche di altri programmatori. O anche da parte tua in un futuro.

Per quanto riguarda il tuo problema te lo risolvo in un secondo.
Anche speravo che riuscivi a capirlo da solo :)

Come il Form, anche il Panel è un contenitore di controlli giusto?
Entrambi sono dei Controls Containers.

quindi invece di fare

for(int i = 0; i < Controls.Count; i++)


Basta modificare in

for(int i = 0; i < Panel1.Controls.Count; i++)




Quindi il tutto diventa cosi


int conta = 0;
            for (int i = 0; i < panel1.Controls.Count; i++)
            {
                if (panel1.Controls[i].GetType() == typeof(PictureBox))
                {
                    panel1.Controls[i].BackgroundImage = imageList1.Images[conta + 2];
                    conta++;
                }
            }




Ora.
Per quanto riguarda l'ordine scorretto.
ti basta invertire il ciclo.


Ecco il codice finale


  int conta = 0;
            for (int i = panel1.Controls.Count - 1; i > 0; i--)
            {
                if (panel1.Controls[i].GetType() == typeof(PictureBox))
                {
                    panel1.Controls[i].BackgroundImage = imageList1.Images[conta + 2];
                    conta++;
                }
            }

mire.forumfree.it/ - Mire Engine
C# UI Designer
14/10/15 19:19
lupetto77
Hai ragione lo penso anch'io mi perdo sempre per le cose più facili, spero che ai pazienza sono ancora agli inizi.

Ho provato il tuo ultimo codice e mi da questo errore:

Eccezione non gestita di tipo 'System.ArgumentOutOfRangeException' in System.Windows.Forms.dll

Ulteriori informazioni: InvalidArgument=Valore di '9' non valido per 'index'.

su questa riga
panel1.Controls[i].BackgroundImage = imageList1.Images[conta + 2];


se metto + 1 carica le immagini, ma una delle pictureBox non viene caricata.
stessa cosa cosi:
panel1.Controls[i].BackgroundImage = imageList1.Images[conta];


ma si può risolvere in questo modo, mettendo >= per farle caricare tutte, cosi:
for (int i = panel1.Controls.Count - 1; i >= 0; i--)


ma l'ordine è sempre sbagliato.
Scusa ancora per l'ignoranza e grazie ancora infinite per la pazienza.
aaa
14/10/15 19:23
TheDarkJuster
Perchè non usi un debugger? E' lì.... comodo... che funziona benissimo..... basta solo premere a lato di una riga di codice e premere il tastino verde a forma di freccia in alto centralmente. Ti renderai conto molto velocemente del problema!

Quell'ECCEZIONE (non gestita) non ERRORE!!!! serve per dirti: stai cercando di accedere in lettura, o in scrittura a della memoria che non fa parte della memoria dedicata alla struttura in esame.
aaa
14/10/15 20:51
lupetto77
Si volevo dire Eccezione e non Errore, non mi veniva la parola :)

Ho risolto cosi:

int conta = 0;
            try
            {
                for (int i = panel1.Controls.Count - 1; i >= 0; i--)
                {
                    if (panel1.Controls[i].GetType() == typeof(PictureBox))
                    {
                        (panel1.Controls["pictureBox" + (2 + conta).ToString()]).BackgroundImage = imageList1.Images[conta];
                        //panel1.Controls[i].BackgroundImage = imageList1.Images[conta + 2];
                        conta++;
                    }
                }
            }
            catch (Exception)
            {

                conta = 0;
            }


va bene o c'è un modo più efficace?
aaa
14/10/15 21:03
TheDarkJuster
Quella eccezione va evitata, non gestita. Devi trovare l'errore logica che porta all'accesso di un indice fuori array. Se l'array è lungo 10 elementi il primo indice è 0, e l'ultimo 9. Quella eccezione è perchè stai cercando di accedere ad un array di X elementi con indice minore di 0 o MAGGIORE O UGUALE a x. Quindi c'è un errore logico, e lo devi trovare.
aaa
14/10/15 22:26
lupetto77
Il codice cosi funziona anche senza gesterire l'eccezzione

int conta = 0;
            for (int i = panel1.Controls.Count - 1; i >= 0; i--)
            {
                if (panel1.Controls[i].GetType() == typeof(PictureBox))
                {
                    panel1.Controls["pictureBox" + (2 + conta).ToString()].BackgroundImage = imageList1.Images[conta];
                    conta++;
                }
            }


Puoi dirmi se va bene come è scritto o se migliorabile puoi dirmi come?
Grazie ancora.
Ultima modifica effettuata da lupetto77 14/10/15 22:28
aaa