Controls.CopyTo: problematiche "strane"....

lunedì 28 agosto 2006 - 19.12

D0X Profilo | Newbie

Ciao a tutti!

Premessa: uso C#.

Allora, propongo sempre uno dei miei problemi "strani":

voglio semplicemente copiare un'instanza di un oggetto Panel e assegnarla ad un altro oggetto Panel. A molti verrebbe in mente di fare così:

Panel P1 = new Panel();
...
SETTO VARIE PROPRIETA' DI P1.
...

Panel P2 = P1;

ok, questa cosa OVVIAMENTE non funziona correttamente dato che ora, se vado a modificare alcune proprietà di P2, queste medesime proprietà vengono modificate "ANCHE" in P1!! Certo, senza instanziare P2 con una new sto semplicemente puntando a P1, nell'heap, tramite una nuova variabile di nome P2. L'oggetto è sempre lo stesso ma puntato da 2 variabili diverse. Ah cara teoria dei linguaggi hehehehehe.

Allora, poichè sembra non essere disponibile una chiamata tipo Clone su un Panel (...che mi permetta di allocare fisicamente nell'heap una nuova porzione di memoria identica al pannello che voglio copiare) l'idea + rozza è quella di copiarlo "A MANO".

Allora si fa:

Panel P2 = new Panel();
P2.BackColor = P1.BackColor;
P2.Location = P1.Location;
P2.Size = P1.Size;
etc...per le proprietà che mi interessa copiare....

Ora voglio portarmi dietro i controlli contenuti in P1 e copiarli in P2:

Control[] array_controls_P1 = new Control[P1.Controls.Count]; //Costruisco l'array che conterrà i controlli che stanno in P1.
P1.Controls.CopyTo(array_controls_P1, 0); //METTO I CONTROLLI DI P1 DENTRO AD UN ARRAY: array_controls_P1.

A questo punto dovrebbe bastare semplicemente la chiamata AddRange per aggiungere i controlli salvati nell'array nel nuovo pannello P2:

P2.Controls.AddRange(array_controls_P1);

TRAGEDIA!!!!! Quando eseguo questa chiamata di metodo TUTTI i controlli che erano originariamente in P1 SCOMPAIONO!!!!! Come se venissero FISICAMENTE tagliati da P1 e incollati in P2!!!!! ASSURDO!!! Qui la teoria dei linguaggi NON mi aiuta più!!!!

Se stampo la lunghezza dell'array di controlli in P1 PRIMA di eseguire la AddRange mi da il numero esatto di controlli in P1.

Dopo Che ho eseguito AddRange ristampo il numero di controlli in P1 e mi da 0!!!!!

Quei controlli erano stati copiati in un array e da lì aggiungi ad un altro pannello (P2) instanziato con new!!!!!!! Si direbbe che la AddRange e la CopyTo facciano cose strane!!! Dove sta il problema? Mi sembra allucinante! Si direbbe che la CopyTo mantenga un array di riferimenti ai controlli di P1 e quando si usa la AddRange non si fa altro che spostare fisicamente l'end-point del puntatore a questi controlli nell'heap da P1 a P2!!! Assurdo!

Qualcuno sa illuminarmi? Mi sembra un problema "interessante"....oh...probabilmente esiste un altro modo di fare una copia di un controllo esistente...in questo caso ringrazio chiunque me lo sappia dire :D

GRAZIE!


---


Mi sono accorto ora di un messaggio di BrainKiller che diceva:

--QUOTE
Mmmmh... gli oggetti o Controls Win Forms che derivano dalla classe madre Object ereditano anche un metodo chiamato MemberwiseClone che però è protetto ed accessibile solo internamente dalla classe o da classi derivate, inoltre fa una shallow-copy e non una deep-copy quindi non è ciò che cerchi.
--QUESTA FRASE MI METTE PAURA!!--
Il .NET Framework sembra non metta a disposizione un sistema per clonare i Controls così come accade con gli Array.
-----
--/QUOTE

Allora lo devo fare per forza a mano ma ho quel problema dei controlli che spariscono....gh.....
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5