Change subitem backcolor of a listview next item

847 views Asked by At

I have a listview filled with SRT subtitle. I'am trying to change listview color based on subtitle errors. Everything is working fine, but color won't change when subtitles is overlapping. I take end-time of one subtitle and start-time of next subtitle. Based on difference, it decide is there overlapping or not. Calculations are OK but backcolor and forecolor won't change. It does change backcolor for current item but I need to change backcolor for next listview item.

'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

There are 0 answers