Steuerelemente gruppieren?
-
Wenn ich z.B. gleiche Panels auf meiner Form habe und in jedem Panel soll die gleiche Art von Daten, nur aber mit unterschiedlichen Werten angezeigt werden.
z.B.:
Panel1
labelx->text="1"
labely->text="2"Panel2
labelx->text="3"
labely->text="4"usw.
gibt es dann eine Möglichkeit auf die Labels über das jeweilige Panel zuzugreifen?
Panel1->labelx
Panel2->labelxDa ich nicht immer im voraus weiß, wie viele Panels ich benötige, möchte ich so quasi ein MusterPanel haben und je nach Anzahl der Daten auf die jeweiligen Panels zu greifen, die wiederum alle die selben Steuerelmente (Labels, Buttons, etc. ) haben.
Ich geh eigentlich davon aus, das es dafür eine Lösung gibt... ich weiß nur nicht genau, nach was ich suchen muss.
Ich hoffe ich hab mich verständlich ausgedrückt und dass mir jemand ein paar Tips hat.Danke schon mal
Gruß Tobi
-
Jedes Control (auch ein Panel) besitzt die Eigenschaft Controls, d.h. eine Liste seiner untergeordneten Controls.
Entweder du durchsuchst diese Liste dann nach dem Namen des Labels oder aber, wenn du weißt, daß die Controls alle in derselben Reihenfolge angelegt sind, kannst du einfach per Index darauf zugreifen:Label label = panel.Controls[idx] as Label;
Edit: Sorry, ist ja hier das C++/CLI .NET Forum, aber ich denke du weißt was gemeint ist...
-
hi,
danke für die Antwort, genau das habe ich gerade auch rausgefunden
Aber noch eine Frage, es müssste doch möglich sein, die selben Namen für die Steuerelemente innerhalb verschiedener Controls (z.B. mein Panel) zu vergeben? Also quasi nur Lokal für eine Panel gültig.
So dass ich dann die verschiedenen Controls z.B. nach "WertX", "WertY", "Name" durchsuchen könnte?Wenn ich allerdings einfach den Namen ändere, dann ist das ja für die ganze Form gültig... und zwei mal z.B. ein LabelWertX ist dann ja nich erlaubt.
-
Nein, die Namen gelten für das gesamte Formular, nicht für die Zuordnung zu den Controls.
Besser wäre es jedoch, wenn du dir ein UserControl bzw. eine von Panel abgeleitete Komponente erzeugen würdest. Dann könntest du die gesamte Funktionalität in diesem neuen Control kapseln und hast keine Probleme mit doppelten Namen etc.
-
Mhh ok... ich glaube ich weiß theoretisch was du meinst
Ich mach mir also ein eigenes UserControlObjekt abgeleitet von der Panelklasse?
Innerhalb dieses Objektes schreib ich mir dann z.B. eine Methode, die die entsprechenden Zuweisungen macht?
Aber wie bekomm ich dann das ganze wieder auf meine Form?Mein normales Panel, zieh ich einfach auf die Form... wie geh ich dann mit meinem UserControl vor?
Oder leg ich die Panels auf der Form ganz normal an und erstelle dann erst das abgeleitete Objekt?
Die könnte ich dann z.B. in eine Liste packen und über den Index auf meine einzelnen Panels zugreifen?Du merkst vielleicht, dass ich mir noch ein bisschen unsicher bin
-
Ich weiß leider nur, wie das bei C# funktioniert.
Dort erzeuge ich über Datei/Neu/Neue Komponente eine neue Datei (mit vordefinierter Klasse) und dann bearbeite ich mit dem Formular-Designer bzw. im Code die entsprechende Klasse.
Nach dem Kompilieren kann ich dann diese Komponente in der ToolBox sehen und auf andere Forms ziehen.
Und ja, das beste wäre, du verwaltest dann die Panels in einer Liste (also programmtechnisch) und greifst dann über den Index darauf zu.
Ich kann zwar C++ und C# (.NET), habe aber mit CLI noch nichts gemacht (bin eigentlich nur aus Versehen auf diesen Thread gestossen, aber ich will dir trotzdem so gut ich kann helfen...)
-
Zum Glück ist das unter .NET mittlerweile fast das selbe. so weiß ich jetzt auf alle Fälle mal was du meinst.
Komm aber heute nicht mehr dazu das ganze umzusetzen... wenn ich dann soweit bin, hab ich bestimmt mal noch nen paar FragenAber danke so weit schon mal
-
Allerdings erscheint mein Steuerelement nicht in der Toolbox... muss ich da noch was extra einstellen?
-
Also das klappt so weit mal
Ein Problem ist jetzt allerdings noch aufgetaucht.
Ich habe also mein Steuerelement LmsPanelControl.
Davon sitzen jetzt insgesamt 16 auf meiner Form, dort im panelPruefTisch.
LmsPanelControl hat die Methode ButtonDisable, die alle Buttons im Steuerelement auf Enable=false setzt.
Diese Methode würd ich nun gern über eine Schleife für alle LmsPanelControl durchführen.for each(LmsPanel::LmsPanelControl^ x in this->panelPruefTisch->Controls) { x->ButtonDisable(); }
Allerdings bekomm ich eine InvalidCastException mit folgender Meldung:
Zusätzliche Informationen: Das Objekt des Typs System.Windows.Forms.Panel kann nicht in Typ LmsPanel.LmsPanelControl umgewandelt werden.
Was mach ich hier noch falsch?