Autor Beitrag
oRAnGe
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 02.12.08 22:35 
Wie wäre es so:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: Mi 03.12.08 11:02 
Hallo,

Du sprichst dauernd vom Namen, dann benutze diesen doch auch:
ausblenden 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();   //  das fehlt
  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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 03.12.08 11:20 
user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
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.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 03.12.08 11:46 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
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.

Wie kommst Du auf das BDS2006? Er hat doch als .NET-Version oben 3.5 angegeben. :gruebel:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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).
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Bei neueren Versionen geht das mit Controls.Find.

Also bin ich davon ausgegangen, dass die Angabe der .NET Version vielleicht nicht stimmt.
oRAnGe Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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