Как да поставя моите субтитри във фонова програма

В моето приложение имам 2 подчинения, които изглежда блокират потребителския интерфейс, RowPrePaint и CellFormatting. Тези 2 подчинения боядисват моите DataGridView клетки в определени цветове въз основа на това каква стойност е вътре в клетката.

Въз основа на друг въпрос Попитах, стигнах до извода, че имам нужда от друга тема. (Hans Passant препоръча BackgroundWorker) Тогава все още бях новак, така че току-що намерих решение за проблемите си и сега те ме настигнаха, защото инструменти като DateTimePicker няма да функционират правилно в моя потребителски интерфейс.

Търсих примери и всички те изглежда включват фоновия инструмент, включващ лента за напредъка или подобен. Също така се натъкнах на правило, което казва, че никога няма достъп до UI обекти в нишка, която не ги е създала. Така че съм объркан дали тези субтитри изобщо трябва да се поставят на фонова работа?

И така, някой знае ли примери, подобни на този, от които мога да се науча? Или имате някакви съвети как мога да сложа тези субтитри в различни теми? Благодаря предварително. Включих 2-те подчинени на проблема

    Private Sub DataGridView1_RowPrePaint(sender As Object, e As DataGridViewRowPrePaintEventArgs) Handles DataGridView1.RowPrePaint

    Dim Row As DataGridViewRow = DataGridView1.Rows(e.RowIndex)   

    If Row.Cells(3).Value = 7 Then
        Row.Cells(0).Style.BackColor = Color.LightSkyBlue
        Row.Cells(1).Style.BackColor = Color.LightSkyBlue
        Row.Cells(2).Style.BackColor = Color.LightSkyBlue
        Row.Cells(3).Style.BackColor = Color.LightSkyBlue
        Row.Cells(4).Style.BackColor = Color.LightSkyBlue
    ElseIf Row.Cells(3).Value = 8 Then
        Row.Cells(0).Style.ForeColor = Color.White
        Row.Cells(1).Style.ForeColor = Color.White
        Row.Cells(2).Style.ForeColor = Color.White
        Row.Cells(3).Style.ForeColor = Color.White
        Row.Cells(4).Style.ForeColor = Color.White
    End If

    Dim value As Integer = Convert.ToInt32(Row.Cells(5).Value)

    Select Case value
        Case "0"
            Row.Cells(5).Style.BackColor = Color.Empty
            Row.Cells(5).Style.ForeColor = Color.White
        Case "1"
            Row.Cells(0).Style.BackColor = Color.LightSkyBlue
            Row.Cells(1).Style.BackColor = Color.LightSkyBlue
            Row.Cells(2).Style.BackColor = Color.LightSkyBlue
            Row.Cells(4).Style.BackColor = Color.LightSkyBlue
            Row.Cells(5).Style.BackColor = Color.LightSkyBlue
            Row.Cells(5).Style.ForeColor = Color.LightSkyBlue
        Case "2"
            Row.Cells(0).Style.BackColor = Color.Chartreuse
            Row.Cells(1).Style.BackColor = Color.Chartreuse
            Row.Cells(2).Style.BackColor = Color.Chartreuse
            Row.Cells(4).Style.BackColor = Color.Chartreuse
            Row.Cells(5).Style.BackColor = Color.Chartreuse
            Row.Cells(5).Style.ForeColor = Color.Chartreuse
        Case "4"
            Row.Cells(0).Style.BackColor = Color.Gainsboro
            Row.Cells(1).Style.BackColor = Color.Gainsboro
            Row.Cells(2).Style.BackColor = Color.Gainsboro
            Row.Cells(4).Style.BackColor = Color.Gainsboro
            Row.Cells(5).Style.BackColor = Color.Gainsboro
            Row.Cells(5).Style.ForeColor = Color.Gainsboro
        Case "5"
            Row.Cells(0).Style.BackColor = Color.RoyalBlue
            Row.Cells(1).Style.BackColor = Color.RoyalBlue
            Row.Cells(2).Style.BackColor = Color.RoyalBlue
            Row.Cells(4).Style.BackColor = Color.RoyalBlue
            Row.Cells(5).Style.BackColor = Color.RoyalBlue
            Row.Cells(5).Style.ForeColor = Color.RoyalBlue
    End Select

    For colval As Integer = 7 To 51 Step 2

        Dim value6 As Integer = Row.Cells(colval).Value

        Select Case value6
            Case "0"
                Row.Cells(colval).Style.BackColor = Color.Empty
                Row.Cells(colval).Style.ForeColor = Color.White
            Case "1"
                Row.Cells(colval).Style.BackColor = Color.LightSkyBlue
                Row.Cells(colval).Style.ForeColor = Color.LightSkyBlue
            Case "2"
                Row.Cells(colval).Style.BackColor = Color.Chartreuse
                Row.Cells(colval).Style.ForeColor = Color.Chartreuse
            Case "3"
                Row.Cells(colval).Style.BackColor = Color.Orange
                Row.Cells(colval).Style.ForeColor = Color.Orange
            Case "4"
                Row.Cells(colval).Style.BackColor = Color.Gainsboro
                Row.Cells(colval).Style.ForeColor = Color.Gainsboro
            Case "5"
                Row.Cells(colval).Style.BackColor = Color.RoyalBlue
                Row.Cells(colval).Style.ForeColor = Color.RoyalBlue
            Case "6"
                Row.Cells(colval).Style.BackColor = Color.Red
                Row.Cells(colval).Style.ForeColor = Color.Red
        End Select

    Next colval

    Dim value53 As Integer = Row.Cells(53).Value

    Select Case value53
        Case "0"
            Row.Cells(53).Style.BackColor = Color.Empty
            Row.Cells(53).Style.ForeColor = Color.White
        Case "1"
            Row.Cells(53).Style.BackColor = Color.Chartreuse
            Row.Cells(53).Style.ForeColor = Color.Chartreuse
        Case "4"
            Row.Cells(53).Style.BackColor = Color.Gainsboro
            Row.Cells(53).Style.ForeColor = Color.Gainsboro
    End Select

End Sub

    Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting

    For k = 8 To 52 Step 2
        Dim row As DataGridViewRow = DataGridView1.Rows(e.RowIndex)                                                 'Declare part of the code to equal row (runs the code faster)
        If row.Cells(k).Value Is DBNull.Value Or row.Cells(k).Value Is Nothing Then Continue For                    'If the database has a null cell or the cell is nothing continue

        Dim firstDate As Date = DirectCast(row.Cells(k).Value, Date)                                                'Declare firstdate as a cell value and convert to date type
        Dim N As Date = Now                                                                                         'Declare N as the date today
        Dim diff As TimeSpan = N - firstDate                                                                        'Declare diff as the tome between N and firstdate

        If diff.Days > 14 AndAlso row.Cells(k + 1).Value = 0 Then                                                   'If the difference between 'diff' is over 14 and col in front of k equals 0
            row.Cells(k - 1).Value = 6                                                                              'Make col behind k = 6
        ElseIf diff.Days > 14 AndAlso row.Cells(k + 1).Value <> 0 Then                                              'Or if the difference between 'diff' is over 14 and col in front of k does not equal 0
            row.Cells(k - 1).Value = row.Cells(k - 3).Value                                                         'Make col behind k equal the value of the col 3 rows behind k
        End If
    Next k
End Sub

person Running Thru The 6With My Code    schedule 14.03.2017    source източник
comment
Тези подчинители на събития се извикват автоматично от datagridview, така че поставянето им във фонов работник е невъзможно. Можете обаче да преместите кода вътре в работния файл, но нямате директен достъп до datagridview. Вместо това трябва да извикате мрежата, за да прочетете нейните свойства. CellFormatting се изпълнява на всяка нова клетка, която се показва. НЕ ЛУПВАЙТЕ в него. използвайте e.ColumnIndex вместо k. Въпреки това манипулирането на стойността в събитието за форматиране също не е правилният начин.   -  person Keith Mifsud    schedule 14.03.2017
comment
И в двата ви метода няма смисъл да ги изпълнявате във фонов режим. Това са предимно операции на потребителския интерфейс и не са включени дълги външни операции.   -  person Sefe    schedule 14.03.2017
comment
Благодаря за отговора. @keith Зададох този въпрос, защото тези 2 конкретни подсистеми причиняват смущения в потребителския интерфейс и блокират показването на кутиите със съобщения отпред и т.н. От вашия коментар бихте ли казали, че тези блокове код трябва да са в различни подсистеми?   -  person Running Thru The 6With My Code    schedule 14.03.2017
comment
@Sefe, ето защо коментарът на Ханс по другия ми въпрос ме хвърли малко. Тези 2 кодови блока обаче блокират потребителския интерфейс и се мъча да разбера защо..   -  person Running Thru The 6With My Code    schedule 14.03.2017
comment
Самите субове не са проблем - кодът в тях е грешен. Освен това включете Option Strict - цяло число никога, никога не може да бъде 3 или 5   -  person Ňɏssa Pøngjǣrdenlarp    schedule 14.03.2017
comment
@Plutonix благодаря за отговора. Вече имам стриктна опция и не излизат грешки. така че ако коригирам кода, като премахна цикъла от форматирането на клетки и т.н., тогава трябва да работи?   -  person Running Thru The 6With My Code    schedule 14.03.2017
comment
Съжаляваме, но Select Case value ... Case "0" когато стойността е цяло число няма да се компилира под Option Strict - вие сравнявате цяло число с низов литерал. Това е приложимо в няколко отношения   -  person Ňɏssa Pøngjǣrdenlarp    schedule 14.03.2017
comment
Здравей @KeithMifsud, искам да заменя циклите в моите подчинени, тъй като смятам, че това ще реши проблема ми, но имам нужда кодовият блок да засегне всяка 2-ра колона в DataGridView. Как мога да променя k на e.ColumnIndex и все още да работи само на всеки 2 колони?   -  person Running Thru The 6With My Code    schedule 20.03.2017
comment
можете да използвате оператора Mod. If e.ColumnIndex >= 8 AndAlso e.ColumnIndex <= 52 AndAlso e.ColumnIndex Mod 2 = 0 Then Това ще премахне цикъла for и ще замени всички k с e.ColumnIndex   -  person Keith Mifsud    schedule 20.03.2017