Thomas Bandt

Über mich | Kontakt | Archiv

Control von Collection zu Collection

Bei meinem Versuch, gecachte UserControls aus dem Cache in einen PlaceHolder zu adden, bin ich darauf gestoßen, dass das so einfach gar nicht geht.

Denn sobald ich ein Control aus der gecachten ControlCollection in den PlaceHolder geadded hatte, wurde dieses aus der Ursprungs-Collection, einer Referenz auf die Collection im Cache, entfernt.

Das führte dann dazu, dass in der gecachten Collection beim zweiten Aufruf nichts mehr vorhanden war, und somit keine Inhalte mehr angezeigt wurden - sehr ärgerlich, zumal mich das beinahe anderthalb Tage gekostet hat, alles in allem.

Des Mysteriums Lösung kam vorhin in der Csharp-Mailingliste von Andre Loker, schönen Dank schonmal :-)

Ich zitiere:

"Bei normalen Collections passiert das überhaupt nicht und würde auch gar nicht gehen, da ein Element i.d.R. nicht weiß, in welcher Collection es sich befindet.

string element1 = "foo";
string element2 = "bar";

ArrayList list = new ArrayList();
list.Add( element1 );
list.Add( element2 );

ArrayList list2 = new ArrayList();
list2.Add( element1 );
list2.Add( element2 );

// element1 und element2 sind in beiden collections:

Trace.Assert( list.Count == 2 );
Trace.Assert( list.Count == list.Count );
Trace.Assert( list[0].Equals( list2[0] ) );
Trace.Assert( list[1].Equals( list2[1] ) );

Eine Ausnahme ist die Control.ControlCollection, welche als Controls-Eigenschaft der Klasse Control benutzt wird (sehr viel "Control" in einem Satz, oder? *g*). Control hat eine Eigenschaft "Parent", die das übergeordnete Steuerelement angibt. Wird ein Steuerelement der ControlCollection zugefügt, wird nachgesehen, ob dessen Parent-Eigenschaft != null ist. Falls ja, wird es aus der ControlCollection des Parents entfernt und dieser Collection zugefügt. Zum Schluss wird nocht die Parent-Eigenschaft auf das Control gesetzt, dass diese Collection enthält. Parent und die ControlCollection arbeiten immer synchron. Das heißt, wenn man selbst die Parent-Eigenschaft ändert, wird das Control automatisch "umgemeldet", arbeitet man mit der ControlCollection, werden Parents umgebogen. Daher ist es unnötig, *sowohl* den Parent eines Controls zu setzen als es der Controls-Eigenschaft des übergeordneten Controls zuzufügen.

Form f = new Form();
Form f2 = new Form();

Button button1 = new Button();
Button button2 = new Button();

f.Controls.Add( button1 );
f.Controls.Add( button2 );

Trace.Assert( f.Controls.Contains( button1 ) );
Trace.Assert( f.Controls.Contains( button2 ) );
Trace.Assert( button1.Parent == f );
Trace.Assert( button2.Parent == f );

f2.Controls.Add( button1 );
f2.Controls.Add( button2 );

// controls warden umgemeldet!

Trace.Assert( f2.Controls.Contains( button1 ) );
Trace.Assert( f2.Controls.Contains( button2 ) );
Trace.Assert( !f.Controls.Contains( button1 ) );
Trace.Assert( !f.Controls.Contains( button2 ) );
Trace.Assert( button1.Parent == f2 );
Trace.Assert( button2.Parent == f2 );

"



« Zurück  |  Weiter »