更改listview下一项的子项背景颜色

时间:2017-01-03 18:33:32

标签: vb.net listview subtitle backcolor

我有一个充满SRT字幕的列表视图。我试图根据字幕错误更改列表视图颜色。一切都很好,但字幕重叠时颜色不会改变。我采用一个副标题的结束时间和下一个副标题的开始时间。根据差异,它决定是否重叠。计算没问题,但背景颜色和前景色不会改变。它确实改变了当前项目的背景颜色,但我需要为下一个listview项目更改背景颜色。

'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 个答案:

没有答案