Autor |
Beitrag |
oRAnGe
Hält's aus hier
Beiträge: 9
|
Verfasst: Di 02.12.08 20:39
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
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 02.12.08 21:23
Bei neueren .NET Versionen gibt es eine Suchmöglichkeit, beim BDS 2006 geht das nur manuell glaube ich:
www.newsgroups-index...uage_-csharp_l9.html
Bei neueren Versionen geht das mit Controls.Find.
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
Hält's aus hier
Beiträge: 9
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 03.12.08 11:20
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mi 03.12.08 11:46
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
Hält's aus hier
Beiträge: 9
|
Verfasst: 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.
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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
Hält's aus hier
Beiträge: 9
|
Verfasst: 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.
mfg, oRAnGe
|
|