C# WPF Inhalt mehrerer Label ändern.

jurrasstoil

Commodore
Registriert
Dez. 2006
Beiträge
4.254
Hey,

sagen wir ich habe eine Reihe von Labels die alle dem gleichen Namensschema folgen, z.bsp. label1, label2, label3, label4, etc. und alle einen bestimmten Content haben.
Jetzt würde ich gerne den Content der Labels ändern, ohne dabei jedes einzeln per Hand aufrufen zu müssen. In javascript würde denen einfach eine ID zuweisen und dann ein Array aller Labels erstellen mit einem Loop und GetElementsById('label'+zahl) und dann entsprechend per Index darauf zugreifen.

Gibt es in C# so etwas ähnliches? Alternativ würde natürlich auch eine Wildcard für den Zugriff auf die Labels funktionieren, also so das ich kein Array brauche.

Meine bisherigen Funde bei Google waren leider nicht sehr hilfreich und versuchten meist etwas anderes zu erreichen, z.bsp. Arrays in ein Label zu schreiben oder auf den Inhalt einer Website per GetElementsById zuzugreifen.

Besten Dank im Voraus.
 
Du könntest von Hand jedes Label in eine List/Array schmeißen und das array durchiterieren.
Dann müsstest du aber sowieso jedes label einzeln anfassen.

Folgender Code ist zwar unschön müsste aber ungefähr hinhauen:

Code:
for (int i = 1; i < 11; i++)
{
	(this.GetType().GetProperty("Label" + i).GetValue(this) as Label).Content = "TRALALA";
}

GGF. musst du es noch deinem Namensschema anpassen (in diesem Fall Label1, .. Label10).
 
Zuletzt bearbeitet von einem Moderator:
Wie @korbenm schon schrieb - in WPF greifst du im Normalfall nicht auf deine Steuerelemente zu.
Du hast deine Variablen und Objekte in deinem Code, und die Steuerelemente reagieren selbständig auf Änderungen und aktualisieren sich von alleine.

Sinnvollerweise verwendest du im Code eine ObservableCollection von einer WasWeißIch-Klasse.
Jetzt stellt sich also folgende Frage: Ist die Anzahl deiner Labels dynamisch? Kann ich bspw. per Klick neue hinzufügen und andere entfernen?
In der Oberfläche hast du dann einen Container (zum Beispiel ListView), der an diese ObservableCollection gebunden ist. Er erstellt dir anhand einer Vorlage (Template) Unterelemente für deiner Objekte in der ObservableCollection. Dieses Template kann dann dein Label beinhalten.
Wenn die Labels fest definiert sind, kannst du deine einzelnen Labels trotzdem an die einzelnen Unterelemente deiner Collection binden, du musst die Bindungen dann nur alle per Hand vornehmen und kannst nicht die Vorlage (Template) nutzen.

Im Endeffekt hast du dann die Collection, die du als Liste ansprechen kannst. Mit foreach oder LINQ geht das dann sehr einfach.

Poste doch mal etwas mehr Code und/oder deine Zielsetzung. Dann kann ich etwas spezifischer auf dich eingehen.

Es grüßt,
der Physikbuddha
 
@madman
Das hatte ich bei meiner ersten Suche auch gefunden, auf den ersten Blick sah mir die Lösung aber so aus, als ob wirklich alle Label durchlaufen werden und da ich noch andere Label habe, ausser label1, label2, etc. hätte es nicht gepasst.

@Marguth
da zeigt sich, was ein blutiger Anfänger ich bin. "as Label" hat es bereits getan. Also, eine ArrayList mit labels.Add(label1) etc. und dann (labels[labelcounter] as Label).Content funktioniert zur Änderung des Contents.

@korbenm, @Physikbuddha
Ich wollte eigentlich nur eine kleine App mit ein paar Timern erstellen. Ein Startknopf startet den ersten Timer, wenn der abgelaufen ist, stoppt der Timer, spielt einen Sound ab, ändert den Hintergrund des Labels/Timers und/oder zeigt eine Meldung an. Klickt man wieder auf den Startknopf startet der nächste Timer, etc. bis alle Timer abgelaufen sind.

Das kann ich jetzt mit einer per Hand gefüllten ArrayList erledigen. Ist natürlich alles andere als elegant und nicht sehr variabel. Für mich mit HTML/CSS/JS Hintergrund alles noch ein wenig ungewohnt. Werde mich mal weiter in den Umgang und übliche und vor allem effektive Vorgehensweise mit WPF einlesen/arbeiten.
 
Hi,

Das hatte ich bei meiner ersten Suche auch gefunden, auf den ersten Blick sah mir die Lösung aber so aus, als ob wirklich alle Label durchlaufen werden und da ich noch andere Label habe, ausser label1, label2, etc. hätte es nicht gepasst.

dann prüfst du beim durchlaufen aller Labels eben einfach, ob es sich um ein Label handelt welches bearbeitet werden soll, und wenn das so ist und das aktuelle Label deinem Schema entspricht arbeitest du damit weiter. Ich sehe da das Problem nicht.

VG,
Mad
 
Madman1209 schrieb:
dann prüfst du beim durchlaufen aller Labels eben einfach, ob es sich um ein Label handelt welches bearbeitet werden soll
Kann sein, dass es unter Umständen nicht ganz trivial ist das "richtige" Label von nem "falschen" zu unterscheiden.
Außerdem ist es auch ineffizient immer über alle Label zu iterieren anstatt gezielt die zu verändern die man verändern will - besonders da einem WPF ziemlich gute Möglichkeiten dafür bietet (Bindings).

@jurrasstoil
Wenn du vor hast dich in Zukunft näher mit WPF zu beschäftigen, solltest du dir unbedingt (wie schon vorgeschlagen) mit dem Thema Data-Binding und dem MVVM-Pattern befassen.

In deinem Fall könnte man es ungefähr so machen:
  • eine Klasse TimerViewModel mit den Eigenschaften deines Timers (Name, Status, RemainingTime) anlegen, die das INotifyPropertyChanged Interface implementiert
  • eine ObservableCollection<TimerViewModel> anlegen in die du zur Laufzeit deine Objekte packen kannst
  • auf GUI Seite ein ItemsControl das du an deine ObservableCollection bindest
  • im ItemsControl kannst du ein Template für die Timer festlegen. In dem Template kannst du dann z.B. Labels anlegen und sie an Eigenschaften deines Timers binden
Auf diese Weise musst du nur noch TimerViewModel Objekte erzeugen und in deine Liste packen.
Die GUI legt dann "automagisch" Timer für dich an ;)
Wenn du an einem Timer was verändern willst, musst du nur das TimerViewModel bearbeiten, die GUI übernimmt die Änderungen selbstständig dank Data-Binding.
 
Zurück
Oben