Entwickler-Ecke
C# - Die Sprache - Namen für Steuerelemente dynamisch vergeben.
oRAnGe - Di 02.12.08 20:39
Titel: Namen für Steuerelemente dynamisch vergeben.
Hallo
Also folgendes Problem:
Ich möchte bei einer WindowsApplication (also kein ASP) die Namen für im Code erzeugte Steuerelemente dynamisch vergeben,
sprich ich möchte zB den Namen "Label"+i damit ich so verschiedene Namen der Labels habe. Ich hab jetzt einiges probiert,
auch Google kann/will mir nicht mehr helfen :(
durch das ändern der "Name"-Eigenschaft ändert sich irgendwie nix.
Erzeugen des Labels mache ich bis jetzt so... falls das irgendwie entscheidend ist.
Es soll eben der Name "lblTest" beim Erzeugen durch einen dynamischen Namen ersetzt werden, falls das möglich ist, bzw. irgendwie anders geändert werden.
C#-Quelltext
1: 2: 3: 4: 5:
| Label lblTest = new Label(); lblTest.Height = 100; lblTest.Width = 100; lblTest.Text = "Das ist das Label"; this.Controls.Add(lblTest); |
Ich hoffe/glaube mir kann da jemand helfen.
danke,
oRAnGe
Ralf Jansen - Di 02.12.08 21:54
Du sprichst doch von Control.Name und nicht vom Variablennamen für ein Control oder?
Wofür möchtest du den den Namen benutzten?
Du erzeugst ja das Control scheinbar selbst also hast du doch schon eine echte Referenz auf das Control die du dir einfach merken kannst. Viel besser als nur der Name der in .NET soweit ich weis weder vorhanden noch eindeutig sein muß.
jaenicke - Di 02.12.08 22:11
Deshalb gibt Find auch ein Liste mit Controls zurück und nicht nur eine einzelne Referenz.
Der bessere Weg ist natürlich einfach ein Array oder eine Liste mit den Referenzen zu erstellen, wenn die Controls erzeugt werden. Aber es geht eben notfalls auch anders.
oRAnGe - Di 02.12.08 22:30
danke für die schnellen antworten.
also, die steuerelemente sollen in einer schleife erzeugt werden,
und ich dachte mir es funktioniert irgendwie, dass ich den Namen des Labels (den mit dem ich es dann anspreche)
mit einer Variable versehen kann.
zB
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| for(int i=1;i<=anzahl_der_datensätze;i++) { Label lblTest+i = new Label(); lblTest+i.Height = 100; lblTest+i.Width = 100; lblTest+i.Text = "Das ist das Label"; this.Controls.Add(lblTest+i); } |
aber das mit dem "+i" funktioniert eben nicht. Jetzt dachte ich ob es da einen anderen Weg gibt.
Ich will sozusagen ein Label erzeugen, und es dann mit dem Namen mit dem es erzeugt wird ansprechen.
jaenicke - Di 02.12.08 22:35
Wie wäre es so:
C#-Quelltext
1: 2: 3: 4:
| Label[] lblarray = new Label[anzahl_der_datensätze]; for(int i = 1; i <= anzahl_der_datensätze; i++) { lblarray[i - 1] = new Label(); |
JüTho - Mi 03.12.08 11:02
Hallo,
Du sprichst dauernd vom
Namen, dann benutze diesen doch auch:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| for(int i=1; i<=anzahl_der_datensätze; i++) { Label lblTest = new Label(); lblTest.Height = 100; lblTest.Width = 100; lblTest.Text = "Das ist das Label"; lblTest.Name = "lblTest" + i.ToString(); this.Controls.Add(lblTest); } |
Dann kannst Du mit
Controls.Find auch nach dem Namen suchen, und der Umweg mit einem zusätzlichen Array kann entfallen. (Dieser Umweg ist aus zwei Gründen schlecht: Das Label steht schon in der Controls-Auflistung, wird also bereits registriert; außerdem hat ein Array eine feste Größe, ist also nicht flexibel genug.)
Jürgen
jaenicke - Mi 03.12.08 11:20
JüTho hat folgendes geschrieben : |
Dann kannst Du mit Controls.Find auch nach dem Namen suchen |
Aber nicht, falls er noch das BDS 2006 verwendet, das geht nämlich wie gesagt erst mit .NET 2.0 und das BDS 2006 nutzt soweit ich weiß 1.1.
JüTho hat folgendes geschrieben : |
außerdem hat ein Array eine feste Größe, ist also nicht flexibel genug. |
Das gilt für die for-Schleife ja auch, deshalb habe ich ja das Array vorgeschlagen, wenn sich die Anzahl der Elemente ändert gibt es ja andere Möglichkeiten, List<Label> zum Beispiel.
jaenicke - Mi 03.12.08 11:48
Naja, aber das Controls.Find hatte ich ganz oben angesprochen, hat aber bei ihm nicht funktioniert (oder er hat es ignoriert).
jaenicke hat folgendes geschrieben : |
Bei neueren Versionen geht das mit Controls.Find. |
Also bin ich davon ausgegangen, dass die Angabe der .NET Version vielleicht nicht stimmt.
oRAnGe - Mi 03.12.08 16:11
Danke euch für die vielen Antworten.
Hab heute leider keine Zeit um die verschiedene Vorschläge zu testen,
aber ich bin mir sicher dass ich den gewünschten effekt erhalte.
array wär natürlich einfach - hab ich wieder zu kompliziert gedacht, bevor ich hier mein Problem gepostet habe. :D
das Controls.Find ist auf jeden Fall schon verfügbar, hab damit noch nie gearbeitet, deswegen kommt mir das etwas neu vor,
mal sehen.
übrigens programmiere ich mit MS-VisualStudio2008, falls das irgendetwas ändern würde...
jaenicke - Mi 03.12.08 16:26
Dann kannst du das ja mit Controls.Find machen, wenn du immer das erste gefundene Control willst, zum Beispiel so, habs gerade mit VS2008 getestet:
C#-Quelltext
1:
| ((Label)this.Controls.Find("lblTest1", false)[0]).Text = "Test"; |
Aber wenn du nicht 100% sicher bist, dass das Control mit dem Namen auch gefunden wird, solltest du dementsprechend Fehlerprüfungen machen, hier bin ich davon ausgegangen, dass es keinen Fehler gibt.
oRAnGe - Di 09.12.08 22:23
Jawohl, Problem gelöst.
Mit der Name-Eigenschaft den Namen dynamisch vergeben und mit Controls.Find
wird das Steuerelement problemlos wieder gefunden.
Hat alles super funktioniert.
Vielen Dank für eure Hilfe.
Ich bin mir sicher das die nächste Frage von mir nicht lange auf sich waren lässt. :lol:
mfg, oRAnGe
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!