В моето приложение имам 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
CellFormatting
се изпълнява на всяка нова клетка, която се показва. НЕ ЛУПВАЙТЕ в него. използвайтеe.ColumnIndex
вместоk
. Въпреки това манипулирането на стойността в събитието за форматиране също не е правилният начин. - person Keith Mifsud   schedule 14.03.2017Select Case value ... Case "0"
когато стойността е цяло число няма да се компилира подOption Strict
- вие сравнявате цяло число с низов литерал. Това е приложимо в няколко отношения - person Ňɏssa Pøngjǣrdenlarp   schedule 14.03.2017DataGridView
. Как мога да променяk
наe.ColumnIndex
и все още да работи само на всеки 2 колони? - person Running Thru The 6With My Code   schedule 20.03.2017Mod
.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