DGV Control änhlich jedoch spaltenweise füllen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von mox.

    DGV Control änhlich jedoch spaltenweise füllen

    Hallo,

    habe nun schon einige Stunden damit vertan, Listview (Details) oder Datagridview spaltenweise zu füllen.
    Datenbindung nicht notwendig, da nur eine Anzeige - ohne Bearbeitung.

    Meine frage, gibt's ein Control das man spaltenweise ohne Umwege füllen kann?

    Versuche eine Art Kalender zu "bauen" - Spalten: Montag, Dienstag, Mittwoch ... usw.
    Einteilung in Zeit nicht nötig.

    Anbei Bild... wie es im Moment aussieht, immerhin :) ... aber die Zeileneinteilung ist ned der Brüller :)

    Hier mal der Code - den ich erst mal nur zum testen so geschrieben hab...

    VB.NET-Quellcode

    1. Private Sub AddItem()
    2. Dim _dAnz As Integer = Termine_offeneTerminListeDataGridView.Rows.Count
    3. Dim v As Integer = 1
    4. For i As Integer = 0 To _dAnz - 1 'Step 7
    5. If v <> DateToWeek(Termine_offeneTerminListeDataGridView.Rows(i).Cells(4).Value) Then
    6. v = DateToWeek(Termine_offeneTerminListeDataGridView.Rows(i).Cells(4).Value)
    7. DataGridView1.Rows.Add("KW: " & v.ToString.Substring(4, 2))
    8. End If
    9. Select Case CDate(Termine_offeneTerminListeDataGridView.Rows(i).Cells(4).Value).DayOfWeek
    10. Case 0
    11. DataGridView1.Rows.Add("", "", "", "", "", "", "", Termine_offeneTerminListeDataGridView.Rows(i).Cells(12).Value)
    12. Case 1
    13. DataGridView1.Rows.Add("", Termine_offeneTerminListeDataGridView.Rows(i).Cells(12).Value)
    14. Case 2
    15. DataGridView1.Rows.Add("", "", Termine_offeneTerminListeDataGridView.Rows(i).Cells(12).Value)
    16. Case 3
    17. DataGridView1.Rows.Add("", "", "", Termine_offeneTerminListeDataGridView.Rows(i).Cells(12).Value)
    18. Case 4
    19. DataGridView1.Rows.Add("", "", "", "", Termine_offeneTerminListeDataGridView.Rows(i).Cells(12).Value)
    20. Case 5
    21. DataGridView1.Rows.Add("", "", "", "", "", Termine_offeneTerminListeDataGridView.Rows(i).Cells(12).Value)
    22. Case 6
    23. DataGridView1.Rows.Add("", "", "", "", "", "", Termine_offeneTerminListeDataGridView.Rows(i).Cells(12).Value)
    24. End Select
    25. Next
    26. ' Formatieren
    27. For y As Integer = 0 To DataGridView1.Rows.Count - 1
    28. If DataGridView1.Rows(y).Cells(0).Value > "" Then
    29. DataGridView1.Rows(y).DefaultCellStyle.BackColor = Color.Gray
    30. DataGridView1.Rows(y).DefaultCellStyle.ForeColor = Color.White
    31. End If
    32. Next
    33. End Sub


    Hab Ihr ne bessere Idee ?

    Oder einen Tipp ? :)


    Vorab danke und viele Grüße
    Michl
    Bilder
    • 36363.JPG

      76,61 kB, 849×655, 104 mal angesehen
    Hab den Code jetzt mal nicht angeschaut. Ein Kalender ist ja nix anderes wie eine Tabelle und dafür eignet sich ein DataGrid. Mir scheint also, als wenn du es so hinbekommen hast, wie du es möchtest. Oder was fehlt dir jetzt noch?
    "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
    Rows.Add() eben. Was erwartest Du sonst mit dem Code? Der Befehl fügt dem DGV ne komplette neue Zeile hinzu. Was Du willst geht nur, indem Du die Spalten des jeweiligen Tags durchschaust und nach der ersten freien Zelle suchst.
    btw: Wie offen bist Du für grundsätzliche Codeverbesserungen?

    EDIT: doofe Frage, hast ja bereits nach Tipps in Post#1 gefragt :S
    Ich bastel mal was.

    Auch wenn in Deinem Code noch einiges unklar ist, lässt sich m.E. der Teil von Zeile 7 bis 49 folgendermaßen komprimieren und verbessern (als 1. Schritt! Da geht noch was!):

    VB.NET-Quellcode

    1. Private Sub AddNewItemAndFormatAllCells()
    2. AddNewItem()
    3. FormatAllCells()
    4. End Sub
    5. Private Sub AddNewItem()
    6. Dim _dAnz As Integer = Termine_offeneTerminListeDataGridView.Rows.Count
    7. Dim v As Integer = 1
    8. For i = 0 To _dAnz - 1 'Step 7
    9. Dim TagDerWoche As Integer = CDate(Termine_offeneTerminListeDataGridView.Rows(i).Cells(4).Value).DayOfWeek
    10. If TagDerWoche = 0 Then TagDerWoche = 7
    11. For Each Row As DataGridViewRow In DataGridView1.Rows
    12. If Row.Cells(TagDerWoche).Value.ToString = "" Then Row.Cells(TagDerWoche).Value = Termine_offeneTerminListeDataGridView.Rows(i).Cells(12).Value : Exit Sub
    13. Next
    14. Next
    15. End Sub
    16. Private Sub FormatAllCells()
    17. For Each Row As DataGridViewRow In DataGridView1.Rows
    18. If Row.Cells(0).Value.ToString <> "" Then
    19. Row.DefaultCellStyle.BackColor = Color.Gray
    20. Row.DefaultCellStyle.ForeColor = Color.White
    21. End If
    22. Next
    23. End Sub


    Anmerkung aus der Ecke Clean Code Development: Deine ursprüngliche Sub AddItem macht 1. mehrere Dinge und 2. mehr als ihr Name vorgaukelt. Daher Auftrennung der Funktion in 3 Teile und Anpassung des Prozedurnamens zu einer Beschreibung, die dem Prozedurinhalt entspricht.

    PS: hab die KW vergessen. Alles so verwirrend. Aber die KW-Geschichte sollte eh in ne eigene Prozedur. Ist klar, oder?
    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.

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „VaporiZed“ ()

    uh danke :)
    werde mir das mal anschauen.... is schon anderer Code als meiner, aber kein wunder ;)

    Sehe ich das auf dem ersten Blick, dass du davon ausgehst, dass im DataGridView1 bereits Zeilen vorhanden sind?

    EDIT:

    Also so ganz verstanden hab ich ned und habs aber mal eins zu eins probiert mit vorher Zeilen anlegen etc.

    Siehe Bild.. das kommt dabei raus..



    EDIT 2 :

    Ich habs :))
    Es muss nicht :Exit Sub heißen, sondern Exit For

    und schon ist die Tabelle perfekt gefüllt !!! Vielen Dank :)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „michl75“ ()