Winform界面开发技巧分享:如何突出显示WinForms网格控件行
DevExpress Winforms Controls 内置140多个UI控件和库,完美构建流畅、美观且易于使用的应用程序。
遇到的问题
在VB Windows Form上工作,有一下VB代码,该代码应该为带有NextCalibrationDate <= to today's date的行提供红色背景(在此情况下只有两行),但是没有实现。当调试应用程序时,似乎代码正在运行,但两行的颜色未更改为红色。目前想知道是否是因为在这些单元格中设置了日期的方式。
Private Sub GridView1_RowStyle(ByVal sender As Object, ByVal e As DevExpress.XtraGrid.Views.Grid.RowStyleEventArgs) Handles GridView1.RowStyle Dim nextCalibDate As Date Dim I As Integer Dim DataRowCount As Integer = GridView1.DataRowCount Dim View As GridView = sender For I = 0 To DataRowCount - 1 If IsDBNull(GridView1.GetRowCellValue(e.RowHandle, colNextCalibrationDt)) Then 'Nothing Else nextCalibDate = GridView1.GetRowCellValue(e.RowHandle, colNextCalibrationDt) If nextCalibDate <= Today.Date Then If (e.RowHandle >= 0) Then e.Appearance.BackColor = Color.Red End If End If End If Next End Sub
仅供参考,这是用来设置NextCalibrationDate的代码:
Dim DataRowCount As Integer = GridView1.DataRowCount DataRowCount -= 1 Dim DateCalibrated As Date = GridView1.GetRowCellValue(DataRowCount, colDateCalibrated) Dim NextCalibrationDt As String 'Set NextCalibrationDt Select Case CalibInterval Case "D" NextCalibrationDt = DateAdd(DateInterval.Day, 1, DateCalibrated) Case "W" NextCalibrationDt = DateAdd(DateInterval.Day, 7, DateCalibrated) Case "M" NextCalibrationDt = DateAdd(DateInterval.Month, 1, DateCalibrated) Case "6mos" NextCalibrationDt = DateAdd(DateInterval.Month, 6, DateCalibrated) Case "Y" NextCalibrationDt = DateAdd(DateInterval.Year, 1, DateCalibrated) Case "B" NextCalibrationDt = DateAdd(DateInterval.Year, 2, DateCalibrated) Case "36mos" NextCalibrationDt = DateAdd(DateInterval.Year, 3, DateCalibrated) Case "N" NextCalibrationDt = "NULL" Case "Calibration Not Required" NextCalibrationDt = "NULL" Case Else NextCalibrationDt = "NULL" End Select If NextCalibrationDt <> "NULL" Then NextCalibrationDt = "'" & NextCalibrationDt & "'" End If Dim sqlString As String = "UPDATE [ToolingCalibration].[dbo].[tblToolCalibration] SET LastCalibrationDt = '" & DateCalibrated & "', NextCalibrationDt = " & NextCalibrationDt & " where RecordID = '" & ToolIdToEdit & "'" Dim toolCmd As New SqlCommand(sqlString, connCalibrationRecord) toolCmd.Connection.Open() toolCmd.ExecuteNonQuery() toolCmd.Connection.Close()
解决方案
为了确保满足您的条件,请在更改e.Appearance.BackColor属性的行中插入一个断点。在特定情况下,RowStyle事件提供的外观设置的优先级低于其他外观设置,启用e.HighPriority选项确保外观设置具有最高优先级。此外,由于每个可见行都会引发RowStyle事件,因此您无需循环执行代码。
在代码结尾处设置e.HighPriority = True可以解决问题。
Private Sub GridView1_RowStyle(ByVal sender As Object, ByVal e As DevExpress.XtraGrid.Views.Grid.RowStyleEventArgs) Handles GridView1.RowStyle Dim nextCalibDate As Date Dim I As Integer Dim View As GridView = sender If IsDBNull(GridView1.GetRowCellValue(e.RowHandle, colNextCalibrationDt)) Then 'Nothing Else nextCalibDate = GridView1.GetRowCellValue(e.RowHandle, colNextCalibrationDt) If nextCalibDate <= Today.Date Then If (e.RowHandle >= 0) Then e.Appearance.BackColor = Color.Red End If e.HighPriority = True 'override any other formatting End If End If End Sub
DevExpress技术交流群2:775869749 欢迎一起进群讨论