DataGridView "Datensätze" nebeneinander anzeigen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von tragl.

    DataGridView "Datensätze" nebeneinander anzeigen

    Ich nochmal. Derzeit arbeite ich an einem Tourenplan für meine Anwendung.

    Es gibt eine Tabelle Tour, darin enthalten sind alle Touren die es Unternehmensweit gibt.
    ID
    TourNr
    Tourname
    Gebiet

    Manche davon werden täglich, manche wöchentlich, manche einmal im Monat gefahren.

    Passend dazu soll's nun einen Tourenplan geben, der in etwa so aufgebaut ist wie in dem PDF-Dokument:


    Die "Gebiete", wo oben Mitte/Süd/Nord steht könnte man sich als Fahrer oder Regionen oder sonst was vorstellen.
    In der Tabelle Tour ist pro TourID das entsprechende Gebiet hinterlegt.

    Jetzt stellt sich mir die Frage, wie ich das ordentlich abbilden kann, denn: Die Anzahl der Gebiete kann pro Standort
    variieren.
    Ich könnte natürlich jetzt die Tabelle Tourenplan wie folgt gestalten:

    ID
    Datum
    Gebiet1
    TourID.Tourname1
    TourID.Tournummer1
    Fahrername1
    Gebiet2
    TourID.Tourname2
    TourID.Tournummer2
    Fahrername2

    etc. - allerdings will ich nicht proforma 10 Gebiete/Touren in der Tabelle als Spalten haben (denn es können ja auch mal mehr und mal weniger sein), daher mein Gedanke für die Tabelle Tourenplan:

    ID
    Datum
    Gebiet
    TourID.Tourname
    TourID.TourNr
    Fahrername

    jetzt gibt es für meinen Standort 3 Gebiete. Diese möchte ich nun beim Öffnen der Form mit einem DataGridView nebeneinander und nicht
    untereinander angezeigt bekommen. Als Anzeigeschlüssel soll das Datum dienen - da ein solcher Plan für jeden Tag im Jahr dient, wird das
    Datum in jedem Gebiet vorkommen.

    Wie stelle ich das am geschicktesten an, sodass ich auch aus dem DGV heraus einen Edit-Dialog für das jeweilige Datum und Gebiet aufrufen
    und den Datensatz enstsprechend editieren kann?

    Mein Gedanke ging in Richtung "fülle das DGV manuell ohne Bindingsource -> For Each Gebiet erstell mir eine Spalte" aber dann wird's mit Editieren des Datensatzes schlecht.
    Außerdem sollen mir beim Editieren nur die Touren der entsprechenden Gebiete zur Auswahl stehen.

    Ist vermutlich mal wieder gaaanz einfach und ich steh' ma wieder auf'm Schlauch. Ich denk' mal ich muss hier irgendwie ein Join-View basteln,
    wovon ich aber leider null Plan hab :(
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    tragl schrieb:

    Ist vermutlich mal wieder gaaanz einfach
    Ich glaub nicht.

    Neulich gabs ein ähnliches Thema: Vorangehensweiße aus 2 Datatables dynamischer Tabellen-View
    Ich zumindest finde es ähnlich.
    Weil ein DGV hat ja normal eine variable Zeilenzahl.
    Soll nun eine variable Spaltenzahl hinzukommen, nenne ich das Konzept "Matrix-View", und da gibts meines Wissens überhaupt kein Control für.
    Im Link entwickel ich auch die Idee, dass ein Matrix-View vom Prinzip her ein DGV sein müsste mit 3 DataSources: eine für die Zeilen, eine für die Spalten, und eine für die Zellen, innerhalb der durch Zeilen und Spalten aufgespannten Matrix.
    Die Werte in den Zellen wären dann auch der Mittler-Tabelle entnommen.
    Also so ein Matrix-View wäre ein spezieller m:n-View.

    Ich hab mich mal vor laaaangem an einem Team-Kalender verkünstelt, aufbauend auf dem Datagrid - Control (DGV gabs damals noch nicht).
    Aber ich krieg das Projekt heute nicht mehr in Gang, das war noch vb.net 2003.
    Man konnte in eine Zelle klicken und bekam als "DetailView", welche Termine der Mitarbeiter an dem Tag hatte.
    Puh, harte Kost. Also ich mach ja echt viel mit Datenbanken und DataGridViews. Aber die Anforderung ist „selbst für mich“ nicht so easy umsetzbar.

    Ich würde mal versuchen ob man da mit einem „dynamischen Datenmodell“ was basteln könnte. Also eine Klasse deren Instanzen in einer List( Of T) ans DataGridView gebunden werden kann. Ich verwende das DataGridView von Devexpress, welches „Custom Unbound Columns“ unterstützt. Dies ermöglicht es Daten aus Listen eines Objekts (Property List (Of T)) als Spalte Darstellen zu können. Damit würde man solch eine Anforderung evtl. hinbekommen. Ob es sowas im normalen WinForms DataGridview gibt weiß ich nicht.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    wie gesagt, ich könnt das DGV auch manuell befüllen.
    Für jeden Tag im Jahr eine Zeile mit dem entspr. Datum drin.
    Dann sowas wie:

    Quellcode

    1. Dim gebiete = DTS.Gebiete.Where(Function(x)x.Gesellschaft = "hier der Gesellschaftsname")
    2. For Each gebiet in Gebiete
    3. erzeuge DGV-Spalten mit Inhalt
    4. Next


    Ich sehe das Problem dann eher in der Editierung der Daten. Da müsste ich für jedes "Rumklicksen" ja den entspr. Datensatz dazu suchen.
    Zumal ich die ID's ja gerne für normale User ausblende - die hab ich also nicht zum Suchen des Datensatzes zur Hand :)
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    tragl schrieb:

    Zumal ich die ID's ja gerne für normale User ausblende - die hab ich also nicht zum Suchen des Datensatzes zur Hand :)
    Nur weil die ID Spalte nicht sichtbar (visible = false) ist, heißt das nicht das sie nicht da ist.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @mrMo: Stimmt auch wieder, dann muss ich da mal rumtüfteln, ob ich das so hinbekommen.
    Da muss ich mir ja nen Edit-Code basteln, der nicht nach der BindingSourcegeht wie sonst überall, sondern nach der DataRow
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Du meinst evtl. nach der DatagridviewRow. Und da die eine ParentRow von ableiten.
    Und weiterer Code muss nach der DGV-Column gehen. Und da die andere ParentRow von ableiten.
    Die geklickste m:n-MittlerRow ergibt sich dann als diesen beiden ParentRows untergeordnet.

    Schön.
    Danach musste dir noch was ausdenken zur Beschriftung der Zeilenköpfe.

    Achguck - jetzt habich immerhin was mir rudimentären Dummi-Daten hinbekommen:

    Is dat nich schnucklig? Schräggestellte Column-Header! So kann man ziemlich viel User in den Kalender stopfen, und bleibt immer noch Platz für die Detail-Sicht.
    Also, ich hab's nun soweit hinbekommen, wie ich das auch wollte:
    Das DGV wird manuell befüllt und For Each Gebiet werden die Spalten erzeugt


    Ich kann auch per Doppelklick editieren


    Das Ergebnis wird auch im DGV angezeigt


    Hier mal der Edit-Code:

    VB.NET-Quellcode

    1. Private Sub dgv_CellDoubleClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgv.CellDoubleClick
    2. If hasEditEntryAccess(_appMod) Then
    3. Dim bsTourenplan As New BindingSource
    4. bsTourenplan.DataSource = Dts.Tourenplan
    5. If Dts.TourGebiet.Where(Function(x) x.Gebiet = dgv.Columns(e.ColumnIndex).Name.RightCut("|")).Count > 0 Then
    6. Dim rwGebiet = Dts.TourGebiet.First(Function(x) x.Gebiet = dgv.Columns(e.ColumnIndex).Name.RightCut("|"))
    7. Dim tourenplanID = convertInteger(dgv.Item($"TourPlanID|{rwGebiet.Gebiet}", e.RowIndex).Value)
    8. bsTourenplan.Position = bsTourenplan.FindX("ID", tourenplanID)
    9. bsTourenplan.EditCurrent(Of dlgTourenplan)
    10. Dim rwTourenplan = bsTourenplan.At(Of TourenplanRow)
    11. 'Anzeige der Änderungen im DGV:
    12. dgv.Item($"TourNr|{rwGebiet.Gebiet}", e.RowIndex).Value = rwTourenplan.TourRow.TourNr
    13. dgv.Item($"TourName|{rwGebiet.Gebiet}", e.RowIndex).Value = rwTourenplan.TourRow.Tourname
    14. dgv.Item($"Fahrer|{rwGebiet.Gebiet}", e.RowIndex).Value = rwTourenplan.MitarbeiterRow.expFullname
    15. dgv.Item($"Fahrzeug|{rwGebiet.Gebiet}", e.RowIndex).Value = rwTourenplan.FahrzeugRow.Kennzeichen
    16. End If
    17. End If
    18. End Sub


    Das einzige, was nicht funktioniert (wäre aber mit das Wichtigste :) :( die Änderungen werden nicht gespeichert.
    Rufe ich den Plan das nächste mal auf, ist der wieder leer...

    Jemand eine Idee? @ErfinderDesRades: Du bist doch fit in sowas. Die Bindingsource aus Zeile 3/4 hängt ja nicht am DGV,
    ich habe mir die nur "geholt", damit ich den Datensatz schön über EditCurrent editieren kann. Muss ich da was
    beachten wegen Speichern? Im normalen DGV mit angegbundener BS klappt das ja immer...

    Edit: hat sich erledigt - war ein Flüchtigkeitsfehler :) läuft also nu erstma wie's soll

    LG
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

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

    ErfinderDesRades schrieb:

    Vielleicht speichert es ja auch,

    ja tut es.
    Durch mein selektives Befüllen des DataSets hab ich im Code verbaselt, die Jahreszahl korrekt zu setzen, weshalb er mir bei jedem Aufruf die Einträge immer wieder neu erstellt hat. Ich hatte mich
    schon gewundert, warum die DB so schnell wächst :D

    Jetzt muss ich nur noch zusehen, wie ich da ein MultiEdit möglich mache...
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup: