Laden...

Objektname als Variable

Erstellt von NameInvalid vor einem Jahr Letzter Beitrag vor einem Jahr 353 Views
N
NameInvalid Themenstarter:in
4 Beiträge seit 2021
vor einem Jahr
Objektname als Variable

Hallo zusammen,

ich stehe vor einem Problem wofür ich einen kleinen Denkanstoß bräuchte. Mein untenstehender Code soll eine gelesene Zeile mit ".split()" zerlegen und in einem Array ablegen, soweit so klar. Das Array soll dann in "Labels" in einem WPF Window ausgegeben werden, woran ich aktuell leider scheitere.

Mein Problem liegt darin, beim durchlaufen der Schleife auf das "nächste" Objekt zu springen und auf dies zu verweisen. Mir fehlt einfach der Ansatz wie ich so etwas lösen könnte.


            string InputLine = "1 2 3 4";

            string[] subs = InputLine.Split(' ');

            //lbl_1.Content = subs[0];
            //lbl_2.Content = subs[1];
            //lbl_3.Content = subs[2];
            //lbl_4.Content = subs[3];
            //lbl_5.Content = subs[4];
            //lbl_6.Content = subs[5];
            //lbl_7.Content = subs[6];
            //lbl_8.Content = subs[7];
            //lbl_9.Content = subs[8];
            //lbl_10.Content = subs[9];

            foreach (string sub in subs)
            {
                lbl_1.Content = sub; // "lbl_1" muss variabel sein, bzw. sich "hochzaehlen" lassen
            }

Danke schonmal für die Mühe

16.835 Beiträge seit 2008
vor einem Jahr

So funktionieren leider nur untypisierte Scriptsprachen (JavaScript, PHP, TCL...), aber nicht Sprachen bzw. Runtimes wie .NET.
Erklärung und Lösung hier:
[FAQ] Variablennamen zur Laufzeit zusammensetzen / Dynamisches Erzeugen von Controls

Fazit: Du musst Dir die Instanzen (bei Dir Labels) merken (zB in einem Array).

3.825 Beiträge seit 2006
vor einem Jahr

Wenn Du die Labels im Code anlegst nach Bedarf dann kannst Du sie als Array anlegen und über Index ansprechen :


Label[] lbl = new Label[100];
...
lbl[i].Content = subs[i];

Wenn Du sie per Hand angelegt hast dann kannst Du nicht per Index ansprechen, aber andersrum geht es :


foreach (var child in ...Children)
    for(int i = 0; i < 100; i++)
    {
         if (child.Name = "lbl_"+ i.Tostring()) child.Content = subs[i];
    }

Wäre nicht eine Tabelle oder Grid besser für die Darstellung vieler Zahlen ?

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

16.835 Beiträge seit 2008
vor einem Jahr

Der Missbrauch des Name-Tags ist auch einer der größten Übel in der WinForms Welt.
Man kann genauso auf den Index zugreifen, man muss halt das Array manuell erstellen (zB im Konstruktor).

3.825 Beiträge seit 2006
vor einem Jahr

Ja, dafür ist der Name-Tag nicht gedacht gewesen.

Wir kennen zuwenig Anforderungen des Thread Erstellers um mehr Tipps geben zu können.

Ist es eine variable Anzahl ? Oder eine feste Anzahl ? Größer 10 ?

In WPF ist eine Liste mit Labels und Data Binding auf jeden Fall die bessere Lösung :


            <ListView x:Name="lvi_devices" ItemTapped="Listview_ItemTapped" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
                <ListView.Header>
                    <Grid ColumnDefinitions="1*" HorizontalOptions="FillAndExpand">
                        <Label Text="Name" FontSize="13" Grid.Column="0"></Label>
                    </Grid>
                </ListView.Header>
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <Grid ColumnDefinitions="1*" HorizontalOptions="FillAndExpand">
                                <Label Text="{Binding name}" FontSize="17" Grid.Column="0"></Label>
                            </Grid>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3