Изменить подэлементный цвет заднего вида следующего элемента

У меня есть список, заполненный SRT субтитрами. Я пытаюсь изменить цвет списка на основе ошибок субтитров. Все работает нормально, но цвет не изменится, когда субтитры перекрываются. Я беру время окончания одного субтитра и время начала следующего субтитра. Основываясь на разнице, он решает, есть ли совпадение или нет. Расчеты в порядке, но задний и передний цвет не изменится. Это меняет цвет фона для текущего элемента, но мне нужно изменить цвет фона для следующего элемента списка.

'EXAMPLE #######################################

For i as integer = 0 to listview1.items.count -1
ListView1.Items(i).UseItemStyleForSubItems = False
'this is working #######
ListView1.Items.Item(i).SubItems(1).BackColor = ColorTranslator.FromHtml("#F0A6A7")

'but this is NOT working ( THIS IS WHAT I NEED) ####################
ListView1.Items.Item(i).SubItems(i + 1).BackColor = ColorTranslator.FromHtml("#F0A6A7")
Next i

"################################################# #######

Public Function Color_Errors(ByVal SubtitleListView As ListView)


        For i = 0 To SubtitleListView.Items.Count - 2


            SubtitleListView.Items(i).UseItemStyleForSubItems = False
            SubtitleListView.Items(i + 1).UseItemStyleForSubItems = False

            SubtitleListView.Items.Item(i).SubItems(1).ResetStyle()
            SubtitleListView.Items.Item(i).SubItems(2).ResetStyle()
            SubtitleListView.Items.Item(i).SubItems(3).ResetStyle()
            SubtitleListView.Items.Item(i).SubItems(4).ResetStyle()
            SubtitleListView.Items.Item(i).SubItems(5).ResetStyle()

            Dim Text As String = SubtitleListView.Items.Item(i + 1).SubItems(5).Text
            Dim TextLength As Integer = Get_Longest_Line_Length(Text)
            Dim NumberOfLines As Integer = Split(Text, "|").Length

            Dim Duration As Double = Convert_Time_to_Milliseconds(SubtitleListView.Items.Item(i).SubItems(4).Text)
            Dim Pause As Double = Convert_Time_to_Milliseconds(SubtitleListView.Items.Item(i).SubItems(1).Text)

            Dim _Start As Double = Convert_Time_to_Milliseconds(SubtitleListView.Items.Item(i).SubItems(2).Text)
            Dim _End As Double = Convert_Time_to_Milliseconds(SubtitleListView.Items.Item(i).SubItems(3).Text)

            Dim _NextStart As Double
            If i < (SubtitleListView.Items.Count - 1) Then
                _NextStart = Convert_TimeSpan_to_Milliseconds(SubtitleListView.Items.Item(i + 1).SubItems(2).Text)
            End If


            'TOO LONG LINES
            If TextLength > MaxLength Then
                SubtitleListView.Items.Item(i).SubItems(5).BackColor = ColorTranslator.FromHtml("#F0A6A7")
                SubtitleListView.Items.Item(i).SubItems(5).ForeColor = Color.Black
            End If

            'TOO LONG DURATION
            If Duration > 6000 Then

                SubtitleListView.Items.Item(i).SubItems(4).BackColor = ColorTranslator.FromHtml("#F5CBD9")
                SubtitleListView.Items.Item(i).SubItems(4).ForeColor = ColorTranslator.FromHtml("#6F0021")

                SubtitleListView.Items.Item(i).SubItems(3).BackColor = ColorTranslator.FromHtml("#F5CBD9")
                SubtitleListView.Items.Item(i).SubItems(3).ForeColor = ColorTranslator.FromHtml("#6F0021")

                'SHORTER THAN 2 SECONDS
            ElseIf Duration < 2000 AndAlso Duration >= 700 Then

                SubtitleListView.Items.Item(i).SubItems(4).BackColor = Color.Red
                SubtitleListView.Items.Item(i).SubItems(4).ForeColor = Color.White

                'TOO SHORT DURATION
            ElseIf Duration < 700 Then

                SubtitleListView.Items.Item(i).SubItems(3).BackColor = ColorTranslator.FromHtml("#FFF0E1")
                SubtitleListView.Items.Item(i).SubItems(3).ForeColor = ColorTranslator.FromHtml("#A45200")

                SubtitleListView.Items.Item(i).SubItems(4).BackColor = ColorTranslator.FromHtml("#FFF0E1")
                SubtitleListView.Items.Item(i).SubItems(4).ForeColor = ColorTranslator.FromHtml("#A45200")

            End If

            ''TOO SHORT PAUSE
            If Pause < 200 Then

                SubtitleListView.Items.Item(i).SubItems(1).BackColor = ColorTranslator.FromHtml("#ACC9E6")
                SubtitleListView.Items.Item(i).SubItems(1).ForeColor = Color.Black

                SubtitleListView.Items.Item(i).SubItems(2).BackColor = ColorTranslator.FromHtml("#ACC9E6")
                SubtitleListView.Items.Item(i).SubItems(2).ForeColor = Color.Black

            End If


            If NumberOfLines > 2 Then
                SubtitleListView.Items.Item(i).SubItems(5).ForeColor = ColorTranslator.FromHtml("#0000FF")
            End If


            'ERROR PART #################################################
            If i < (SubtitleListView.Items.Count - 1) Then
                If _End > _NextStart Then
                    SubtitleListView.Items.Item(i + 1).SubItems(1).BackColor = ColorTranslator.FromHtml("#BB0025")
                    SubtitleListView.Items.Item(i + 1).SubItems(1).ForeColor = Color.White


                    SubtitleListView.Items.Item(i).SubItems(2).BackColor = ColorTranslator.FromHtml("#BB0025")
                    SubtitleListView.Items.Item(i).SubItems(2).ForeColor = Color.White

                End If
            End If
            '############################################################


        Next i



        Return Nothing

    End Function



    Public Function Convert_Time_to_Milliseconds(ByVal Time As String)

        If Time.Contains(":") = True Then

            Dim VremePrviDeo() As String = Split(Time, ":")

            If VremePrviDeo.Length = 3 Then

                Dim Sati As Integer = VremePrviDeo(0) * 60 * 60 * 1000
                Dim Minuti As Integer = VremePrviDeo(1) * 60 * 1000

                Dim VremeDrugiDeo() As String = Split(VremePrviDeo(2), ",")
                Dim Sekunde As Integer = VremeDrugiDeo(0) * 1000
                Dim Milisekunde As Integer = VremeDrugiDeo(1)

                Dim Miliseconds As Double = Sati + Minuti + Sekunde + Milisekunde

                Return Miliseconds.ToString

            ElseIf VremePrviDeo.Length = 2 Then

                Dim Minuti As Integer = VremePrviDeo(0) * 60 * 1000

                Dim VremeDrugiDeo() As String = Split(VremePrviDeo(2), ",")
                Dim Sekunde As Integer = VremeDrugiDeo(0) * 1000
                Dim Milisekunde As Integer = VremeDrugiDeo(1)

                Dim Miliseconds As Double = Minuti + Sekunde + Milisekunde

                Return Miliseconds.ToString

            End If

        Else

            Dim VremePrviDeo() As String = Split(Time, ",")

            Dim Sekunde As Integer = VremePrviDeo(0) * 1000
            Dim Milisekunde As Integer = VremePrviDeo(1)

            Dim Miliseconds As Double = Sekunde + Milisekunde

            Return Miliseconds.ToString

        End If

        Return Nothing

    End Function


    Public Function Get_Longest_Line_Length(ByVal Text As String)

        Dim Duzina As Integer = 0

        For Each line As String In Split(Text, "|")
            If line.Length > Duzina Then
                Duzina = line.Length
            End If
        Next

        Return Duzina

    End Function

  Public Function Convert_TimeSpan_to_Milliseconds(ByVal Time As String)

        'Try

        Dim Parsed() As String = Parse_String_to_TimeSpan(Time)

        Dim Sat As Double = TimeSpan.FromHours(Parsed(0)).TotalMilliseconds
        Dim Minut As Double = TimeSpan.FromMinutes(Parsed(1)).TotalMilliseconds
        Dim Sekunda As Double = TimeSpan.FromSeconds(Parsed(2)).TotalMilliseconds
        Dim Milisekunda As Double = TimeSpan.FromMilliseconds(Parsed(3)).TotalMilliseconds

        Dim TotalTime As Double = Sat + Minut + Sekunda + Milisekunda

        Return TotalTime

        'Catch ex As Exception

        'End Try

        'Return Nothing

    End Function

0 ответов

Другие вопросы по тегам