Kommt darauf an, ob Du die Zeitmessungen direkt in die Datenbank
eintragen willst (Schlüsselbeziehung "ID" zu "ProjektID" in timetable).
Hier ein untypisiertes Beispiel, soweit ich Dein Anliegen verstanden habe.
Im linken Grid einige Projektsätze, im rechten Grid werden Zeitmessungen
angezeigt, die jeweils über den Button für ein Projekt gestartet und
wieder beendet werden.
Mehrere Zeitmessungen für unterschiedliche Projekte können parallel laufen.
Public Class frmRowTimer
'Daten
Dim dt As New DataTable
Dim bs As New BindingSource
Dim dgv As New DataGridView With _
{.Parent = Me, .Top = 50, .Width = 200, .DataSource = bs}
'Zeitmessung
Dim timetable As New DataTable
Dim bsTime As New BindingSource
Dim dgvTime As New DataGridView With _
{.Parent = Me, .Top = 50, .Left = 210, .DataSource = bsTime}
Dim WithEvents btnStartStop As New Button With _
{.Parent = Me, .Text = "Start/Stop"}
Private Sub frmRowTimer_Load(sender As System.Object, _
e As System.EventArgs) Handles MyBase.Load
dt.Columns.Add("ID", GetType(Integer))
dt.Columns.Add("Project", GetType(String))
'Testdatensätze
For i As Integer = 1 To 10
dt.Rows.Add(i, "Projekt " & Chr(i))
Next i
bs.DataSource = dt
With timetable.Columns
.Add("ID", GetType(Integer)) 'Primär-Schlüssel
.Add("ProjectID", GetType(Integer)) 'Fremdschlüssel Projekt-Tabelle
.Add("Start", GetType(Date)) 'Startzeitpunkt
.Add("Ende", GetType(Date))
.Add("Intervall", GetType(Integer)) 'gemessene Sekunden
End With
bsTime.DataSource = timetable
End Sub
Private Function TimeTable_IndexOf(ByVal ProjectID As Integer) As Integer
'Ermittlung des TimeTable-Index einer offenen Zeitmessung zur
'gegebenen ProjektID
With timetable
For i As Integer = 0 To .Rows.Count - 1
If DirectCast(.Rows(i).Item("ProjectID"), Integer) = _
ProjectID AndAlso _
IsDBNull(.Rows(i).Item("Ende")) Then
Return i
End If
Next
End With
Return -1
End Function
Private Sub btnStartStop_Click(sender As Object, _
e As System.EventArgs) Handles btnStartStop.Click
If bs.Position < 0 Then
MsgBox("Keine Projektwahl") : Exit Sub
End If
'Aktuell ausgewähltes Projekt
Dim row As DataRow = DirectCast(bs(bs.Position), DataRowView).Row
Dim projectid As Integer = CInt(row.Item("ID"))
Dim rowindex As Integer = TimeTable_IndexOf(projectid)
With timetable
If rowindex = -1 Then
'Keine offene Zeitmessung --> neue Messung starten
.Rows.Add(.Rows.Count, projectid, Now, DBNull.Value, _
DBNull.Value)
Else
'vorhandene Zeitmessung abschließen
.Rows(rowindex)("Ende") = Now
Dim start As Date = DirectCast(.Rows(rowindex)("Start"), Date)
Dim ende As Date = DirectCast(.Rows(rowindex)("Ende"), Date)
.Rows(rowindex)("Intervall") = _
New TimeSpan(ende.Ticks - start.Ticks).TotalSeconds
End If
End With
bsTime.ResetBindings(False)
End Sub
End Class
Beitrag wurde zuletzt am 22.01.14 um 17:33:56 editiert. |