Eine bearbeitbare Projekt-Timeline als DGV erstellen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von Gelöschter Benutzer.

    Eine bearbeitbare Projekt-Timeline als DGV erstellen

    Hallo liebe Profis :)

    Ich brauchte mal wieder ein Problem und dachte mir ich versuche mich an einer Timeline - schwubbs war das Problem da :D
    Im Prinzip wollte ich das ganze mit einem DGV lösen - sollte das vollkommen falsch sein habt bitte Nachsicht mit mir und teilt mir einen besseren Weg mit :)

    Um das ganze mal grob zu umreißen - soweit bin ich bisher gekommen:
    • Man kann einen Zeitraum definieren (hab ich mit 2 DateTimePickern gemacht)
    • Die Differenz zwischen den Tagen wird ermittelt (Gesamttage), Wochenenden werden abgezogen (Arbeitstage)
    • Das DGV mit einer Reihe und entsprechend den Gesamttagen Spalten wird gefüllt. Headertext ist immer das Datum, nur am Wochenende steht WE im Header.
    • Im DGV lassen sich mehrere Zellen markieren und einfärben (damit möchte ich die verschiedenen Todo's darstellen)
    • Weitere Reihen lassen sich hinzufügen, falls sich Vorgänge überschneiden.
    • Weitere Tage lassen sich hinzufügen falls sich das Projekt verlängern sollte
    • Mit dem Mausrad lässt sich das DGV zur besseren übersicht bei längeren Timelines Zoomen
    Und hier komme ich nicht weiter:
    • Die letzte Spalte löschen
    • Von markierter Zelle an zb 5 Spalten einfärben (als Alternative anstatt selber zu markieren direkt "Blöcke" füllen - zB ToDo2 dauert immer 5 Tage)
    • Fast die wichtigste Frage :D : Kann man ein so erstelltes DGV überhaupt speichern ? :saint:
    Um sich das ganze besser vorstellen zu können hab ich mal einen Screenshot gemacht. Designtechnisch ists natürlich nicht der Brüller, aber hier gehts ja erstmal nur um Funktionalität ^^
    Links oben Start-Datum, rechts oben Ende-Datum.
    In der mitte die 3 Textfelder 1: Arbeitstage 2: Gesamttage 3: Welcher Todo und somit Farbe ist ausgewählt.
    Links 7 ToDo-Möglichkeiten samt Farben
    Unten das erstellte DGV in das ich bereits reingemalt habe.





    Ich weiß, jetzt werden viele erstmal wieder die Hände über ihrem Kopf zusammenschlagen, aber das ganze befindet sich ja noch in der Bastelphase - das wäre mein Code dazu:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim GesamtTage As Integer
    2. Dim Number As String = 0
    3. Dim addende As String = 0
    4. Private Function GetWorkDays(ByVal StartDate As Date, ByVal EndDate As Date) As Long
    5. Dim Tage As Long = DateAndTime.DateDiff(DateInterval.Day, StartDate, EndDate)
    6. For N As Long = 0 To Tage
    7. If DateAndTime.DateAdd(DateInterval.Day, N, StartDate).DayOfWeek <> DayOfWeek.Saturday And
    8. DateAndTime.DateAdd(DateInterval.Day, N, StartDate).DayOfWeek <> DayOfWeek.Sunday Then
    9. GetWorkDays += 1
    10. End If
    11. Next
    12. End Function
    13. Function ISWeekend(Datum As Date) As Boolean
    14. ISWeekend = (Weekday(Datum) Mod 6 = 1)
    15. End Function
    16. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    17. Panel1.BackColor = Color.Red
    18. Panel2.BackColor = Color.Blue
    19. Panel3.BackColor = Color.Yellow
    20. Panel4.BackColor = Color.Green
    21. Panel5.BackColor = Color.Purple
    22. Panel6.BackColor = Color.Brown
    23. Panel7.BackColor = Color.Orange
    24. End Sub
    25. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles tege_berech.Click
    26. TextBox1.Text = GetWorkDays(DateTimePicker1.Value, DateTimePicker2.Value).ToString
    27. Dim start As DateTime = DateTimePicker1.Value
    28. Dim ende As DateTime = DateTimePicker2.Value
    29. start = Strings.Left(start, 10)
    30. ende = Strings.Left(ende, 10)
    31. GesamtTage = ende.Subtract(start).Days
    32. TextBox3.Text = (GesamtTage.ToString)
    33. End Sub
    34. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles DGV_fill.Click
    35. Dim start As DateTime = DateTimePicker1.Value
    36. Dim ende As DateTime = DateTimePicker2.Value
    37. start = Strings.Left(start, 10)
    38. ende = Strings.Left(ende, 10)
    39. DataGridView1.Columns.Add(1, start)
    40. For i = 0 To GesamtTage - 1
    41. Dim DataDatum As Date
    42. Dim StartDate As String
    43. Dim days As Double
    44. Dim SecondDate As Date
    45. Dim IntervalType As DateInterval
    46. IntervalType = DateInterval.Day
    47. StartDate = start
    48. SecondDate = CDate(StartDate)
    49. Number = Number + 1
    50. days = Val(Number)
    51. DataDatum = DateAdd(IntervalType, days, SecondDate)
    52. DataDatum = Strings.Left(DataDatum, 10)
    53. If ISWeekend(DataDatum) Then
    54. DataGridView1.Columns.Add(1, "Wochenende")
    55. Else
    56. DataGridView1.Columns.Add(1, DataDatum)
    57. End If
    58. Next i
    59. For Each col As DataGridViewColumn In DataGridView1.Columns
    60. col.SortMode = DataGridViewColumnSortMode.NotSortable
    61. Next
    62. End Sub
    63. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles row_add.Click
    64. DataGridView1.Rows.Insert(0, 1)
    65. End Sub
    66. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles colorieren.Click
    67. DataGridView1.CurrentRow.DefaultCellStyle.BackColor = Color.White
    68. For Each cell As DataGridViewCell In DataGridView1.SelectedCells
    69. If TextBox2.Text = "" Then
    70. MessageBox.Show("Bitte Kategorie wählen", "info", MessageBoxButtons.OK, MessageBoxIcon.Error)
    71. Exit Sub
    72. End If
    73. If TextBox2.Text = "ToDo1" Then cell.Style.BackColor = Color.Red
    74. If TextBox2.Text = "ToDo2" Then cell.Style.BackColor = Color.Blue
    75. If TextBox2.Text = "ToDo3" Then cell.Style.BackColor = Color.Yellow
    76. If TextBox2.Text = "ToDo4" Then cell.Style.BackColor = Color.Green
    77. If TextBox2.Text = "ToDo5" Then cell.Style.BackColor = Color.Purple
    78. If TextBox2.Text = "ToDo6" Then cell.Style.BackColor = Color.Brown
    79. If TextBox2.Text = "ToDo7" Then cell.Style.BackColor = Color.Orange
    80. Next
    81. DataGridView1.ClearSelection()
    82. End Sub
    83. Private Sub DataGridView1_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles DataGridView1.MouseWheel
    84. If My.Computer.Keyboard.CtrlKeyDown Then
    85. Dim newHeight As Int32 = DataGridView1.RowTemplate.Height + (e.Delta / 120) * 2
    86. DataGridView1.RowTemplate.Height = newHeight
    87. For Each row As DataGridViewRow In DataGridView1.Rows
    88. row.Height = newHeight
    89. Next
    90. For Each col As DataGridViewColumn In DataGridView1.Columns
    91. col.Width += (e.Delta / 120) * 40
    92. Next
    93. Dim newFont As Font
    94. Try
    95. newFont = New System.Drawing.Font(Me.DataGridView1.Font.FontFamily, Me.DataGridView1.Font.Size + (e.Delta / 120) * 1, Me.DataGridView1.Font.Style, Me.DataGridView1.Font.Unit)
    96. Catch ex As Exception
    97. newFont = Me.DataGridView1.Font
    98. End Try
    99. Me.DataGridView1.Font = newFont
    100. DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
    101. DataGridView1.AutoResizeColumns()
    102. End If
    103. End Sub
    104. Private Sub Panel1_Click(sender As Object, e As EventArgs) Handles Panel1.Click
    105. TextBox2.Text = "ToDo1"
    106. End Sub
    107. Private Sub Panel2_Click(sender As Object, e As EventArgs) Handles Panel2.Click
    108. TextBox2.Text = "ToDo2"
    109. End Sub
    110. Private Sub Panel3_Click(sender As Object, e As EventArgs) Handles Panel3.Click
    111. TextBox2.Text = "ToDo3"
    112. End Sub
    113. Private Sub Panel4_Click(sender As Object, e As EventArgs) Handles Panel4.Click
    114. TextBox2.Text = "ToDo4"
    115. End Sub
    116. Private Sub Panel5_Click(sender As Object, e As EventArgs) Handles Panel5.Click
    117. TextBox2.Text = "ToDo5"
    118. End Sub
    119. Private Sub Panel6_Click(sender As Object, e As EventArgs) Handles Panel6.Click
    120. TextBox2.Text = "ToDo6"
    121. End Sub
    122. Private Sub Panel7_Click(sender As Object, e As EventArgs) Handles Panel7.Click
    123. TextBox2.Text = "ToDo7"
    124. End Sub
    125. Private Sub Button5_Click(sender As Object, e As EventArgs) Handles tage_add.Click
    126. Dim ende As DateTime = DateTimePicker2.Value
    127. addende = addende + 1
    128. ende = Strings.Left(ende, 10)
    129. ende = ende.AddDays(addende)
    130. Dim Column_X As DataGridViewTextBoxColumn = New DataGridViewTextBoxColumn()
    131. Column_X.HeaderText = ende
    132. DataGridView1.Columns.Add(Column_X)
    133. Dim txt As String = DataGridView1.Columns.Item(0).HeaderText
    134. End Sub




    LG und schonmal Danke für kommenden Input,
    DDD
    Bilder
    • 1.PNG

      69,22 kB, 1.149×873, 459 mal angesehen
    Hi!

    Dim Number As String = 0
    Warum nimmste da den String und kein Integer?
    Desweitern würde ich dir raten ein Dataset, mit DataTable zu nutzen, damit ist es um Welten einfacher deine Daten zu speichern.
    Somit beantwortet sich auch:
    Kann man ein so erstelltes DGV überhaupt speichern ?


    Die Lösung hierzu:
    Die letzte Spalte löschen

    wäre dann auch mit dem DataSet + zugehörigem DataTable abgehackt.
    Sprich: Daten aus dem Dataset löschen DGV einfach aktualiseren und feddich