Dynamisch auf nicht-dynamisch erstellte Controls zugreifen

Don Philippo

Mitglied
Hallo Leute,

hab folgendes Problem. Habe mehrer pictureBoxes in einem Panel.

pictureBox1, pictureBox2, pictureBox3, ...

Kann man diese Control-Namen (Bezeichner) auch dynamisch zusammenbauen, um darauf zuzugreifen.
Wie ordne ich z.B. bei 100 Bildboxen das gleiche Bild zu, ohne im Code 100-Mal

Code:
pictureBox1.Image = Image.FromFile(sFilePath);
pictureBox2.Image = Image.FromFile(sFilePath);
pictureBox3.Image = Image.FromFile(sFilePath);
...
...
pictureBox<n-1>.Image = Image.FromFile(sFilePath);
pictureBox<n>.Image = Image.FromFile(sFilePath);


die selbe Zuordnung schreiben zu müssen?!
Geht doch bestimmt eleganter mit ner For-Schleife oder so!?
Ich komm nicht drauf! :(

Freu mich über Eure Hilfe
 

CPoly

Mitglied Weizenbier
Ich weis nicht ob es auch eleganter geht:
Code:
foreach (Control c in panel1.Controls)
{
try
{
((PictureBox)c).Image = Image.FromFile("c:\\a.jpg");
}
catch (Exception ex)
{ }
}
 

Don Philippo

Mitglied
Hey CPoly,

Danke. Das ging ja schnell!!
Funktioniert astrein. Kurz und bündig, somit mehr als elegant! ;-)

Hier der Beweis im Bild als Anhang. :)

Großes MERCI!!
 

Anhänge

  • bp01.jpg
    bp01.jpg
    98,4 KB · Aufrufe: 78

CPoly

Mitglied Weizenbier
Ich muss nochmal antworten, weil mir eben aufgefallen ist, dass es wesentlich eleganter funktioniert, ohne dass man ständig in eine Exception rennt, die man dann abfängt.

Code:
foreach (Control c in panel1.Controls)
{
if(c is PictureBox)
    ((PictureBox)c).Image = Image.FromFile("c:\\a.jpg");
}
 

Don Philippo

Mitglied
Hat alles wunderbar funktioniert.
Nun hab ich noch ein kleines Problemchen, in der Hoffnung, dass ihr mir helfen könnt?!

Hab z.B. nun 49 Pictureboxen denen ich je nach Lottoergebnis neue Bilder zuordnen möchte.
Z.B. kann man auch dynamisch den Picturebox-Namen "zusammenbauen" und dann dieser PB ein neues Bild zuweisen!?
Anders erklärt möchte ich den Index im PictureBox-Namen dynamisch bestimmen und dann ein Bild genau der Box zuweisen, die diesen Index im Namen beinhaltet.

In etwa so (schematisch) für "pictureBox27.Image":
Code:
int i = 27;
"pictureBox2"+i.ToString().Image() .... = Image.FromFile(...

Nicht lachen, sieht jetzt vielleicht blöd aus, aber ich hoffe ich konnte es so am anschaulichsten vermitteln!

Wisst ihr ne elegente Lösung?
 
Zuletzt bearbeitet:

Masterclavat

Erfahrenes Mitglied
Das geht über die Eigenschaft "Controls" der System.Windows.Forms-Klasse.

Etwa so:

C#:
int i = 27;
(PictureBox)(this.Controls["pictureBox2"+i.ToString()]).Image = Image.FromFile(...
 
Zuletzt bearbeitet:

Don Philippo

Mitglied
Merci für die schnelle Antwort.
Genauso brauch ich's! :)

Leider funktioniert das noch nicht so. Bekomm ecklige Compiler-Fehler.

Bei folgendem Code kennt er die Definition "Image" nicht ... erst, wenn ich die Klammern (rot) drumrummsetz compiliert das System
Code:
...

((PictureBox)(this.Controls["pictureBox" + aiGen[iGenIdx].ToString()])).Image = Image.FromFile(...

...

Dann bekomm ich jedoch während der Programmausführung Fehlermeldungen, die ich aber nicht nachvollziehen kann (siehe Bild im Anhang).

Freu mich auf antwort!
Danke!
 

Anhänge

  • dynPB.jpg
    dynPB.jpg
    323,8 KB · Aufrufe: 28

Cromon

Erfahrenes Mitglied
Mein ehemaliger Informatikprofessor würde sich im Grab umdrehen, wenn er tot wäre und das lesen würde. Fast jede Vorlesung hat er auf uns eingeprügelt: "Nicht mehr als einen Seiteneffekt pro Anweisung verursachen, sonst verliert ihr die Übersicht!".

Genau das rate ich auch dir: Teil diese Monsteranweisung einfach mal schön Schritt für Schritt auf. Erstens weisst du dann, wo genau der Fehler liegt und zweitens kannst du prüfen, wie die einzelnen Werte bisher ausgewertet wurden und du kannst auch sicherstellen, dass die Auswertungsreihenfolge so ist, wie du es erwartest.
 

Don Philippo

Mitglied
Jepp! Danke!
Unser Prof sagte immer: "Manchmal hilft auch 'n Tritt in den Hintern!" :)

Danke! Hab's komplett zerlegt und einzeln "entkäfert".
Echt peinlich. Die pictureBoxen sind nicht Teil des Hauptframes, sprich "this", sondern befinden sich in einem Panel "panelLottoSheet".
Somit konnte nur NULL zurückgeben werden, weil das System die Bildboxen nicht gefunden hat!

Jetzt sieht's so aus, der Vollständigkeit halber:
Code:
((PictureBox)(panelLottoSheet.Controls[sPbID])).Image = Image.FromFile(...

Tja ... bei 32°C sollte man was anderes machen, als programmieren! ;)

Trotzdem nochmal DANKE für's PUSHEN! :)