Mam formularz, który oblicza daty TimeSpan. Muszę uzyskać sumę 3 TimeSpan S, a następnie uzyskać sumę następnych 3 itd. Do ostatniego timespan.

To jest mój kod do tej pory:

Jestem w stanie uzyskać sumę TimeSpan s, ale tylko łącznie wszystkich sum i są wyświetlane błędne. Czy ktoś może mi z tym pomóc?

Sub HoursCalculation()
    Dim textBoxes1A() As TextBox = {TextBox1, TextBox3, TextBox5, TextBox7, TextBox9, TextBox11}
    Dim textBoxes1B() As TextBox = {TextBox2, TextBox4, TextBox6, TextBox8, TextBox10, TextBox12}
    Dim textBoxesTOT() As TextBox = {TextBox221, TextBox222, TextBox223, TextBox224, TextBox225, TextBox226, TextBox227}
    Dim total As Date
    Dim ts1 As TimeSpan
    Dim i As Integer
    Dim t As Integer

    For i = 0 To textBoxes1A.Count - 1
        If IsDate(textBoxes1A(i).Text) AndAlso IsDate(textBoxes1B(i).Text) Then
            ts1 = DateTime.Parse(textBoxes1B(i).Text).Subtract(DateTime.Parse(textBoxes1A(i).Text))
            ' Add all the differences to a total
            total = total.Add(ts1)
            textBoxesTOT(t).Text = total
        End If
    Next
End Sub

Dzięki

-1
Raffa b 20 luty 2019, 12:59

2 odpowiedzi

Najlepsza odpowiedź

Musisz wykonać następujące czynności:

  1. Zresetuj wartość total co 3 dodatki.
  2. Przywróć wartość t co 3 dodatki.
  3. (Korzystnie), a nie przy użyciu IsDate(), a następnie Parse ing wartości, należy użyć DateTime.TryParse().

Twój kod powinien wyglądać mniej więcej tak:

Sub HoursCalculation()
    Dim textBoxes1A() As TextBox = {TextBox1, TextBox3, TextBox5, TextBox7, TextBox9, TextBox11}
    Dim textBoxes1B() As TextBox = {TextBox2, TextBox4, TextBox6, TextBox8, TextBox10, TextBox12}
    Dim textBoxesTOT() As TextBox = {TextBox221, TextBox222, TextBox223, TextBox224, TextBox225,
                                     TextBox226, TextBox227}
    Dim total As TimeSpan
    Dim i, t As Integer

    For i = 0 To textBoxes1A.Count - 1
        Dim dateA, dateB As Date
        If Date.TryParse(textBoxes1A(i).Text, dateA) AndAlso Date.TryParse(textBoxes1B(i).Text, dateB) Then
            total = total.Add(dateB.Subtract(dateA))
            textBoxesTOT(t).Text = total.ToString()
            If i Mod 3 = 2 Then
                total = TimeSpan.Zero
                t += 1
            End If
        End If
    Next
End Sub

Jedno zalecenie końcowe: Spróbuj zawsze używać znaczących nazw dla zmiennych i elementów sterujących. Unikaj używania rzeczy takich jak TextBox1, TextBox2 i t (i jest w porządku tutaj, jeśli jest używany jako indeks pętli For ).

1
Ahmed Abdelhameed 20 luty 2019, 11:40

Cóż, musisz zresetować swój total na każdej trzeciej pętli:

If i Mod 3 = 2 Then total = New TimeSpan(0) 'assuming that total is TimeSpan

Ta linia powinna być umieszczona na końcu pętli.

1
Michał Turczyn 20 luty 2019, 11:03