Elegante Lösung für Schleife 50 Labels vb.net

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von Kaypetri.

    Elegante Lösung für Schleife 50 Labels vb.net

    Hallo zusammen, ich mal wieder. Ich habe mal ein kleine Frage bezüglich Vorgehen und wollte mal euer Schwarmwissen anzapfen. Folgende Situation. Ich habe 5 Tische mit jeweils 10 Sitzplätzen. Die Gäste werden in einen Datagridview eingelesen und erhalten dort Ihren Tisch und die Platznummer. Nach dem drücken eines Update Buttons sollen die Sitzplätze (Label mit Namen Lbl_T1_P1; Lbl_T1_P2; ... usw), T steht hier für den Tisch und P für den Platz, deren Textinhalt mit dem Namen des Gastes umgeschrieben werden. Ich habe mir das zunächst Beispielhaft mal so erstellt:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim i As Integer
    3. For i = 0 To DT_TurnierspielerDataGridView.RowCount - 2 '-2 da letzte zeile leer ist
    4. Dim sTable, sPlace, sSplit As String
    5. Dim aSplit() As String
    6. sTable = DT_TurnierspielerDataGridView.Rows(i).Cells(1).Value.ToString 'Tisch
    7. sPlace = DT_TurnierspielerDataGridView.Rows(i).Cells(2).Value.ToString 'Platz
    8. If sTable = "1" And sPlace = "1" Then
    9. sSplit = DT_TurnierspielerDataGridView.Rows(i).Cells(0).Value.ToString
    10. aSplit = Split(sSplit, " ")
    11. Lbl_T1_P1.Text = aSplit(0) & vbCrLf & aSplit(1)
    12. Lbl_T1_P1.BackColor = Color.Green
    13. ElseIf sTable = "1" And sPlace = "2" Then
    14. sSplit = DT_TurnierspielerDataGridView.Rows(i).Cells(0).Value.ToString
    15. aSplit = Split(sSplit, " ")
    16. Lbl_T1_P2.Text = aSplit(0) & vbCrLf & aSplit(1)
    17. Lbl_T1_P2.BackColor = Color.Green
    18. End If
    19. Next
    20. End Sub


    Jetzt kann ich mir aber gerade nicht so recht vorstellen dass es wirklich notwendig ist jetzt 50x die selbe Schleifen zu schreiben nur weil der Label Name sich um 1 Wert erhöht. Wie wäre denn evtl. eine Sinnvolle Alternative das zu machen? Evtl. eine Schleife / Tisch? Gibt es nenn komplett anderen Ansatz?

    Gruß Kay
    Alle Labels in ein Array packen und das Array in der Schleife durchgehen.
    Oder gar keine Labels verwenden, sondern ein Massencontrol, was Schleifenverarbeitung an sich unterstützt.
    Von dem Ansprechen von Controls über den Namen kann ich nur abraten.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Feste Namen sind für Schleifendurchgänge normalerweise so nicht zu gebrauchen. Man könnte Labels in einem Array verwenden - vielleicht sogar zweidimensional, um es weiter vereinfachen zu können - oder Labels in eine bzw. zwei Listen packen, um sie dann mit einem Index - ähnlich wie in einem Array - ansprechen zu können. Was am Ende dann für einen einfacher oder schöner ist, darf sich jeder selbst aussuchen, sofern er programmtechnisch in der Lage ist, das auch entsprechend umzusetzen. Alles nacheinander im Code auszuschreiben ist eigentlich nie gut, es sei denn man optimiert etwas für Geschwindigkeit im Assembler oder auf der ersten Abstraktionsstufe in C, die sehr nah am Assembler liegt - dass das mit dem alles nacheinander Ausschreiben in so einem normalen vb.NET-Fall eine Sackgasse ist, wird man spätestens dann feststellen, wenn aus 50 Stück auf einmal z.B. 500 oder 5000 werden, weil sich die Bedingungen geändert haben, denn es gibt nicht nur Tische, Menschen, Stühle und Fische.
    Das gleichzeitige Erscheinen von Dummheit und Unmündigkeit nach Immanuel Kant ist eines der schlimmsten Dinge, die einem Homo sapiens in geistiger Hinsicht widerfahren können, hat manchmal aber auch durchaus seine Vorteile.
    komplett anderen Ansatz
    Ich kann dir nur dringend empfehlen, mach dir ein typisiertes Dataset als Datenmodell deiner Datenverarbeitung.
    Darin die Tabellen Tisch, Platz, Gast, GastPlatz (Zuordnungs-Tabelle)
    Daran kannst du DGVs binden - die können das sehr schön anzeigen, und Eingaben machen.
    gugge vb-paradise.de/allgemeines/tip…die-vier-views-auf-video/
    Wenn es sich (wie's mir aussieht) um eine Turnier-Verwaltung handelt, wird das Datenmodell noch komplexer - da gibts ja auch Runden, Ergebnisse, und vlt. scheiden Spieler (sinds nu "Gäste" oder Spieler?) auch aus oder sowas.
    Solch ist imo ohne Datenmodell überhaupt garnet mehr zu händeln.



    Das mit den 50 Labels scheint mir sehr unglücklich. Ich würde - basierend auf dem Datenmodell - ein DGV dergestalt ertüchtigen, dass es Gäste,Tische,Plätze in ansprechender Form präsentiert.

    Aber wenn du erstmal so weiterwursteln willst: Irgendwie muss man die Labels mit den zugehörigen Datensätzen assoziieren.
    Von diesen Assoziationen würde ich ein Array erstellen, oder liebernoch eine Liste.
    Als Assoziations-Klasse kann man Tuple(Of T1, T2) nehmen, oder eine anonyme Klasse, oder man schreibt ausdrücklich eine kleine Assoziazions-Klasse - auch kein Hexenwerk.

    Jedenfalls stimme ich dir zu, dass dein bisheriger Ansatz ziemlich gruslig ist.
    Danke für eure Antworten zunächst. Ich muss evtl. noch etwas ausholen um das Thema zu beschreiben. Wie @ErfinderDesRades bereits erkannt hat geht es um eine Turniersoftware. Die Teilnehmenden Spieler werden in einem DataGridView gelistet welches sich an einem Dataset orientiert das vorher mit Name, Tisch und Platznummer befüllt wird. Diesen DataTable gibt es also schon. Was ich nun eigentlich brauche, ist eine Visualisierung in der Form. Hier werden die Tische mittels Picturebox dargestellt, drum herum dann die 10 Plätze (aktuell) als Label. Diese sollen Grün werden, sowie den Namen des Spielers annehmen wenn dieser Platz belegt ist.Mein Endziel muss also eine Visualisierung mit Namen sein.
    Dann muss sich jetzt nur noch jemand an die Tastatur hinsetzen das gewünschte Ergebnis schreiben... : ) BTW, jede erdenkliche Logik kann man leider nicht durchautomatisieren lassen, egal welche Gymnastik man betreibt oder wie sehr man sich auf der Yogamatte verbiegen würde – manchmal bleibt nichts anderes übrig als in die Hände zu spucken, den Spaten in die Hand zu nehmen und sie am Ende selbst zu schreiben oder zumindest den fehlenden Rest, den der Roboter nicht schaffen konnte, für einen versierten Enthusiasten dürfte das aber kein Problem sein.
    Das gleichzeitige Erscheinen von Dummheit und Unmündigkeit nach Immanuel Kant ist eines der schlimmsten Dinge, die einem Homo sapiens in geistiger Hinsicht widerfahren können, hat manchmal aber auch durchaus seine Vorteile.

    Gregor Jasinski schrieb:

    Dann muss sich jetzt nur noch jemand an die Tastatur hinsetzen das gewünschte Ergebnis schreiben... : )


    Das mache ich schon selber. Ich habe hier nicht nach ner fertigen Vorlage gefragt. Mir geht es um die Methodik sowas sinnvoll zu erledigen. Dass man an irgendeienem Punkt dann auch zeilen zusammenbringen muss, das ist schon klar.

    Kaypetri schrieb:

    (...) Mir geht es um die Methodik sowas sinnvoll zu erledigen (...)

    Sich vorher Gedanken machen ist natürlich wichtig, was aber tatsächlich sinnvoll sein wird oder nicht, wird sich vermutlich erst unterwegs (beim Schreiben) herausstellen bzw. herauskristallisieren, das eine oder andere Problem kann man vorher überhaupt nicht sehen, gar nicht ahnen oder die eigenen Kenntnisse können das Ausgedachte dann doch ziemlich begrenzen oder einschränken - es kommt auch oft vor, dass man dann das Konzept beim Schreiben ändern oder sogar ganz umkrempeln muss. Weniger ist manchmal auch mehr.
    Das gleichzeitige Erscheinen von Dummheit und Unmündigkeit nach Immanuel Kant ist eines der schlimmsten Dinge, die einem Homo sapiens in geistiger Hinsicht widerfahren können, hat manchmal aber auch durchaus seine Vorteile.

    Kaypetri schrieb:

    Visualisierung in der Form. Hier werden die Tische mittels Picturebox dargestellt, drum herum dann die 10 Plätze (aktuell) als Label.
    Ich empfehle sehr, Visualisierung von Datenverarbeitung zu trennen.
    Bau erstmal ein geeignetes Datenmodell.
    Dann mit einigen DGVs eine beliebig hässliche Oberfläche, die in geeigneter Weise ans Datenmodell gebunden sind, und mit der dein Proggi dann tun kann was es soll (featurecomplete).
    Da hübsche Pictureboxen, und Labels grün und rot und so schnickschnack - das kommt zuletzt.

    Was sind das für Turniere, bei dem jeweils 10 Leute an 5 Tischen sitzen?

    Etwa für die Verwaltung eines Schachturniers wäre es zunächstmal zweitrangig, wo wer sitzt. Relevant ist, wer in welcher Runde gegen wen spielt, und das Ergebnis.
    Klar, die Sitz-Ordnung kann man auch mit aufnehmen - sehe ich aber nicht als das Kernthema.

    ErfinderDesRades schrieb:

    Was sind das für Turniere, bei dem jeweils 10 Leute an 5 Tischen sitzen?


    Es handelt sich um Pokerturniere. Da wird jedem Teilnehmer am Anfang ein Platz zugelost. Je weiter er im Turnier voran kommt muss er dann solange die Tische und Plätze wechseln bis er letztlich den "Final-Table" erreicht. Das ist auch etwas was dann mit verarbeitet werden muss. Im Laufe des Turniers ändert sich die Sitzposition noch aktiver Spieler.
    Das es zunächst hässlich ist sehe ich auch so. Das was ich bis dato habe waren eben meine ersten Gedankengänge. Aber bin ja ziemlich schnell dazu gekommen dass hier was an der Methode gemacht werden könnte, müsste, sollte.
    Ich schau mal wie ich mit euren Hinweisen weiter komme. Wird schon werden.

    Kaypetri schrieb:

    Das es zunächst hässlich ist sehe ich auch so (...)

    Ich glaube, was er damit meinte war, dass die grafische Oberfläche erstmal so ziemlich egal ist, weil man erstmal den Motor/die Logik hinbekommen sollte - wenn man das erledigt hat, kann man hinterher auch die Oberfläche ordentlicher/besser/schöner machen oder endgültig ausarbeiten; vorher macht es keinen Sinn, da zu viel Arbeit und Energie reinzustecken, da sich ja noch sowieso viel ändern kann.
    Das gleichzeitige Erscheinen von Dummheit und Unmündigkeit nach Immanuel Kant ist eines der schlimmsten Dinge, die einem Homo sapiens in geistiger Hinsicht widerfahren können, hat manchmal aber auch durchaus seine Vorteile.
    ja, guck unbedingt die 4 View-Tuts, und guck auch ungefähr sämtliche dort verlinkten Tuts.
    Die Themen Datenmodellierung, Databinding, und auch Forms-Layout - alles eiglich nicht schwierig.
    Aber man musses lernen und beherrschen - dann wirds ziemlich einfach, sone TurnierVerwaltung zu schreiben.
    Dasses eigentlich einfach ist, zeigt sich auch daran, dassich glaub schon so einige Hinweise zum Datenmodell geben kann, aus dem ff:
    Nämlich Tabellen
    Spieler
    Runde
    Spiel
    Spieler_Spiel

    Also es gibt viele Runden. Jede Runde hat mehrere Spiele
    Jedem Spiel sind mehrere Spieler zugeordnet, über die Tabelle Spieler_Spiel.
    Weil ein Spieler nimmt ja an mehreren Spielen teil.
    Also folgende Relationen:

    Quellcode

    1. Runde->Spiel
    2. Spiel->Spieler_Spiel
    3. Spieler->Spieler_Spiel
    Das -> bedeutet: links ist die ParentTable, rechts die ChildTable. Oder umgangsprachlich: -> bedeutet: "hat viele".

    Zum Tische-Problem hätte ich auch eine einfache Lösung: In Spiel wird auch die Tischnummer festgehalten. Dann kann man 5 Datagridviews anzeigen, die alle die Spieler_Spiele derselben Runde anzeigen, nur jeweils auf eine andere Tischnummer gefiltert.
    Das ist super-einfach und gleichzeitig gut benutzbar für den User: der kann sich durch die Runden klicksen und sieht wer wo gessesen ist (und Spiel-Ergebnisse auch, etc)

    Aber wie gesagt: erstma Grundlagen lernen, insbes die "relationale Grundidee" (ist da auch verlinkt).

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    So, ich habe mir heute Früh die Tuts mal durchgelesen und behaupte mal das System dahinter mit den Bindings halbwegs verstanden zu haben. Ich habe das jetzt mal eben kurz ausprobiert und hänge dann wohl doch etwas am Verständnis.
    Was auf keinen Fall passieren darf ist ja, wenn der Turnierleiter irgendeinen Namen in der DGV anklickt, sich plötzlich ein control im Text verändert. Die Controls (labels oder was dann letztlich auch immer) müssen immer gleich sein. Nur in dem Fall das ein Spieler von einem Tisch an einen anderen wandert bekommt dieser dann zu seinem Namen die korrekte Tisch und Platznummer. die alte Nummer kommt dann meist komplett aus dem Spiel. Es werden also keine Runden in dem Sinn gespielt, es ist ein fortlaufendes Spiel bei dem Spieler einfach aus dem turnier ausscheiden und sich das dann letztlich auf einen Tisch reduziert. Am Final-Table Tisch 1 kann also später jemand sitzen der an Tisch 5 ins Turnier gestartet ist. Ich denke jetzt nochmal intensiver darüber nach wie sich es dann sinnvoll über die Bindings lösen lies. Die Modellierung der Bindings wird das ausschlaggebende sein.

    Kaypetri schrieb:

    Die Modellierung der Bindings wird das ausschlaggebende sein.
    Nein - ausschlaggebend ist das Datenmodell.
    Die Vorgänge des Turniers müssen sich in korrekter Weise in DataTables und Relations widerspiegeln.

    Vielleicht meinst du das ja auch, und verwendest nur den Begriff "Bindings" falsch.
    Weil tatsächlich kann man garnet sprechen von "Modellierung der Bindings".
    Bindings tut man setzen, und bestimmt damit, welche Daten in welchem Control wie angezeigt werden.
    Ein Modell kommt dabei nicht heraus, sondern die Benutzeroberfläche.

    Kaypetri schrieb:

    Was auf keinen Fall passieren darf ist ja, wenn der Turnierleiter irgendeinen Namen in der DGV anklickt, sich plötzlich ein control im Text verändert.
    Diese Befürchtung kann ich nicht nachvollziehen.
    Wieso sollte sowas passieren? (wenn du es nicht selbst programmiert hast)

    Kaypetri schrieb:

    ...Es werden also keine Runden in dem Sinn gespielt, es ist ein fortlaufendes Spiel bei dem Spieler...
    Ich kapier auch offensichtlich garnet, wie so ein Turnier ablaufen soll. Es gibt keine Runden, es ist nur ein einziges fortlaufendes Spiel? Poker? Hä?
    Also in meiner Welt fängt ein Kartenspiel mit dem Mischen an, und ist beendet, wenn man die Karten wieder einsammelt. Dassis meine Definition eines Kartenspiels. Und wenn ihr in euerm Turnier nur ein einziges Spiel habt, ... ?(



    Jo, wie sieht denn dein Datenmodell aus? häng doch mal ein Screenshot von deim typDataset an.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Kaypetri schrieb:

    (..) Ich habe das jetzt mal eben kurz ausprobiert und hänge dann wohl doch etwas am Verständnis. Was auf keinen Fall passieren darf ist ja, wenn der Turnierleiter irgendeinen Namen in der DGV anklickt, sich plötzlich ein control im Text verändert (...)

    Die Qual der Wahl – binden/durchautomatisieren und 95% dem Roboter überlassen oder 95% schreiben und nur den bescheidenen Rest vom Roboter erledigen lassen – das ist hier die Frage, hauptsache man pokert nicht zu hoch beim Spielen mit dem Roboter, denn Mitleid oder Gnade kennen sie nicht : ) Ich bevorzuge in meinen Projekten ausnahmslos die selbstprogrammierte Methode für die Mechanik, Motorik und Logik meiner Oberflächen und überhaupt allem, was sich bewegt, einen Ton von sich gibt oder eine Änderung bei Klick herbeiführen soll, also alles ohne durchautomatisierte Bindungen, gebunden werden manchmal ein paar Kleinigkeiten, wo es für mich persönlich Sinn macht und gut zum Konzept passt; aber wie ich schon sagte – das muss jeder für sich selbst entscheiden – und vor allem realistisch einschätzen, was er aktuell kann oder nicht kann; man sollte auch danach entscheiden, was einem besser in der Hand liegt und nicht was andere sagen, etwas als ach-so-toll gerade angepriesen wird oder en vogue ist, und vor allem - sich auch nicht unter Druck setzen lassen. Das Schlimmste, was einem mit dem eigenen Projekt passieren kann, ist, dass etwas funktioniert, weil man z.B. ein passendes Stück Code bekommen hat, man aber nicht wirklich versteht, warum es das tut. Dann gibt es noch den Fall, dass man etwas nicht zu Ende bringen kann, weil man sich z.B. übernommen hat - das wird sich unweigerlich unbewusst auf die folgenden Projekte auswirken – lieber etwas weniger und einfacher, aber fertiggestellt, als viel und nur halbfertig oder viertelfertig, also am Ende gar nicht fertig. Kleine Projekte, die man erfolgreich abschließen kann, auch wenn sie von der Optik ein bisschen hässlich sind und von der geschriebenen Mechanik etwas primitiv erscheinen mögen, bringen einen oft weiter als große Pläne, die nie realisiert werden konnten – der Faktor Psyche spielt immer mit und entscheidet dann über den weiteren Verlauf.
    Das gleichzeitige Erscheinen von Dummheit und Unmündigkeit nach Immanuel Kant ist eines der schlimmsten Dinge, die einem Homo sapiens in geistiger Hinsicht widerfahren können, hat manchmal aber auch durchaus seine Vorteile.
    ich hab ma gschwind eine Lösung für das mit den Tischen gebastelt.

    Indem man bei TischId eine Nr einträgt, setzt sich der Spieler an den entsprechenden Tisch.
    Spieler zufügen/löschen kann man nur im "alle anderen Spieler" - Grid.

    Achtung: Enthält viel mehr als nur die Lösung, weil ich einfach mein DatenverarbeitungsTemplate bisserl umgebastelt hab.
    Wichtig ist nur das Dataset, und das MainForm.
    Dateien

    ErfinderDesRades schrieb:

    Also in meiner Welt fängt ein Kartenspiel mit dem Mischen an, und ist beendet, wenn man die Karten wieder einsammelt. Dassis meine Definition eines Kartenspiels. Und wenn ihr in euerm Turnier nur ein einziges Spiel habt


    HIHI. Wir spielen natürlich schon mehrere Kartenrunden. Halt solange bis jemand den Tisch verlassen muss weil er entweder keine Chips mehr hat oder eben auf Grund der Table-Balance an einen anderen Tisch rücken muss. Das jetzt alles im Detail zu erläutern wäre nenn ziemlich langer Text und passt im Grunde auch nicht hier ins Thema.
    So wie Dein Beispiel ging mir das jetzt am Wochenende auch durch den Kopf. Anhand deiner Tut's wäre der Tisch Quasi die Kategorie, der Platz der Artikel und der Name letztlich die Eigenschaft des Artikels. Das werde ich so mal umsetzen, einfach weil es ein interessantes Thema ist und ich sowas noch nicht gemacht habe (Lerneffekt).
    So, jetzt bin ich es doch nochmal. Ein Problem tut sich nun letztlich doch noch auf. Ich möchte ein einem Control die Backgroundfarbe ändern und zwar NACHDEM die Bindings durchgelaufen sind. Also meinetwegen ein CellValueChange Event das ein anderes Control mit Farbe auslöst.
    Grundsätzlich klappt das auch, allerdings wird das immer ausgelöst bevor die Bindings durchgelaufen sind. Kann man das so gestalten dass die Bindings immer als erstes durchgeführt werden müssen?