Laden...

WinForms - Label in Array wiederfinden

Erstellt von Xtq vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.775 Views
X
Xtq Themenstarter:in
22 Beiträge seit 2013
vor 9 Jahren
WinForms - Label in Array wiederfinden

Hallo zusammen,

ich habe ein Problem mit dem Wiederfinden meiner Labels.
Es werden Regale dargestellt, die Inventar enthalten. Jedes Inventarstück ist mit einem Label dargestellt.
Die einzelnen Regale werden nebeneinander dargestellt, sodass horizontal gescrollt werden muss.

Ich habe eine Klasse erstellt, die alle nötigen Informationen & das dynamisch erzeugte Label des Inventarteils enthält.
Nun möchte ich mir alle Informationen zu den Inventarstücken per Klick auf das Label anzeigen lassen.

Ich schaffe es nicht, das Label in meinem Array wieder zu finden.

Bisher habe ich es über die Location des Labels versucht, nur durch das Scrollen wird die X-Koordinate immer wieder verändert, sodass ich nicht auf das Label zurückschliessen kann...
Auch der Label-Text hilft mir nicht weiter, weil es mehrere Labels mit zB "Rechner" gibt.

Gibt es eine Möglichkeit, Labels eine Unique ID wie zB eine GUID zu geben?
Oder vielleicht hat jemand eine andere Idee? (Der Label-Text ist fest vorgegeben)

Gruß X

2.298 Beiträge seit 2010
vor 9 Jahren

Eventuell solltest du ein Dictionary statt eines Arrays verwenden. Als Key bietet sich dann das Label an, da dieses eindeutig ist.

Quasi wie folgt:


Dictionary<Label, RegalInfo> regalInfos;

Ansonsten fällt mir nur der Weg ein, dass du das Array in einer Schleife durchlaufen musst, bis du dein Label gefunden hast.

Alternativ sei noch gesagt, dass an ein Label in der "Tag"-Eigenschaft jedes mögliche Objekt gehängt werden kann. Vielleicht hilft dir auch das weiter. So könntest du deine Regalinfo's direkt beim Label anhängen und bei Klick auf das Label einfach den Tag auslesen und die Info's anzeigen.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

X
Xtq Themenstarter:in
22 Beiträge seit 2013
vor 9 Jahren

Danke für die schnelle Antwort!

Wenn meine Methode Probleme machen sollte, werde ich deine Tipps direkt ausprobieren.

Ich habe eine Methode gefunden, einem Label etwas wie eine ID zu verpassen.
Label.Name habe ich dafür missbraucht.
Jedes Label hat jetzt einen einzigartigen Namen, um es wieder zu finden.

Spricht etwas dagegen?

2.298 Beiträge seit 2010
vor 9 Jahren

Grundsätzlich spricht nichts dagegen, wobei eben der Weg über das Dictionary vermutlich die beste Option wäre. Zum einen weil du deutlich weniger Code schreiben musst und zum anderen weil es denk ich effizienter ist.

Bei der Initialisierung:


Dictionary<Label, RegalInfo> regalInfos = new Dictionary<Label, RegalInfo>();

// labels erstellen
//...
regalInfos.Add(label1, meineRegalInfos);

Anschließend der Zugriff nach einem Klick:


private void Label_Click(Object sender, EventArgs e)
{
       Label label = sender as Label;
       if(regalInfos.ContainsKey(label))
       {
            RegalInfo info = regalInfos(label);
            // do whatever you want
       }
}

Der Alternative Weg über das Tag des Labels wäre dann sogar noch performanter. - Schließlich kennst du das Label auf das geklickt wurde und musst nur noch den Tag auslesen.

Für die Initialisierung bietet sich dann halt folgendes an:


// label erstellen
// ...
// regalinfo-Objekt erstellen
// ...
label.Tag = meineRegalInfos;

Das auslesen wird dadurch sichtlich einfacher:


private void Label_Click(Object sender, EventArgs e)
{
       Label label = sender as Label;
       if(label.Tag != null)
       {
            RegalInfo info = label.Tag as RegalInfo;
            // do whatever you want
       }
}

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

X
Xtq Themenstarter:in
22 Beiträge seit 2013
vor 9 Jahren

Ja das sieht schon etwas effizienter aus.

Ich denke das Tag zu verwenden wird interessant für mich.
Diese Methode gefällt mir eigentlich ganz gut und sie bietet noch schöne Extras durch das Anhängen von Objekte.

Vielen Dank für deine Hilfe! Es hat mir auf jeden Fall sehr geholfen 😃

S
322 Beiträge seit 2007
vor 9 Jahren

Hallo,

es gibt auch eine Möglichkeit den Index im Array abzufragen:


Label[] test = new Label[4];

for (int i = 0; i < test.Length; i++)
{
   test[i] = new Label();
}

int index = Array.IndexOf(test, test[2]);
2.298 Beiträge seit 2010
vor 9 Jahren

Hallo steffen_dec,

wenn ich Xtq richtig verstanden habe, hatte er jedoch nichts in der Richtung sondern eher eine Art "RegalItem"-Array, bei dem jedes Item einen Namen hatte bzw. jedes Item das zugeordnete Label kannte. Damit würde deine Lösung rausfallen.

Sein Anliegen war ja nicht an das Label zu kommen. - Das kannte er ja. - Er wollte an die zugeordneten Regal-Informationen.

Für seinen Ausgangsstand wäre das also etwas in der Richtung gewesen:


private void Label_Click(Object sender, EventArgs e)
{
    Label label = sender as Label;
    
    foreach(RegalInfo regalInfo in myRegalInfos)
    {
         if(regalInfo.Label == label)
         {
              // do stuff
              break;
         }
    }
}

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

X
Xtq Themenstarter:in
22 Beiträge seit 2013
vor 9 Jahren

Ich habe einen kleinen Fehler in einer meiner Schleifen gefunden.

Ich mache es jetzt, genau wie von inflames2k als letztes beschrieben, über die Eindeutigkeit der Labels.