私の DataGrid には、値がその列の 1 番目、2 番目、または 3 番目に最適な値である場合にセルに背景色を適用したい特定の列があります。データ型はすべて、string、int、byte、または double のいずれかのプリミティブです。
Winforms を使用した私の古い VB プロジェクトでは、次のことを行います。 - 列をループして、色付けしたいものだけを選択します。- 各列について、そのセルのすべての行からすべての個別の値を抽出します。- 値を並べ替え、その個々の行の好みに基づいて、昇順または降順で上位 3 つの値を決定します。- 列を再度ループし、上位 3 つの値のいずれかに一致する場合は、セルの背景色に色を付けます。最初にイエロー、2 番目にライトグリーン、1 番目にライトブルーを使用しました。
値コンバーターの設定の優れた例を見つけましたが、その特定の列のすべてのデータを調べる良い方法がわかりません。また、私が知る限り、WPF の DataGrid では個々のセルにアクセスできないようです。
私が間違っている?これを行う方法はありますか?
参考までに、WinForms グリッド用の 8 年前の VB コードを次に示します。これは、セルを色付けするだけではありません。これを行うためにWPFで始める良い方法を見つけることさえできません。
Private Sub ColorizeRows(ByRef dgv As DataGridView) ' 行を色付けします Dim colors() As System.Drawing.Color = {Color.Yellow, Color.Orange, Color.LightBlue}
For Each column As DataGridViewColumn In dgv.Columns
If column.Visible = True Then
Dim vals() As Object = GetDistinctValuesFromColumn(dgv, column.Index)
Select Case column.ToolTipText.ToLower()
Case "d"
For Each row As DataGridViewRow In dgv.Rows
row.Cells(column.Index).Style.BackColor = dgv.Columns(column.Index).DefaultCellStyle.BackColor
Next
Dim lowCount As Integer = (vals.GetUpperBound(0) + 1) - 3
If lowCount < 0 Then lowCount = 0
For j As Integer = vals.GetUpperBound(0) To lowCount Step -1
For Each row As DataGridViewRow In dgv.Rows
If (Not (row.Cells(column.Index).FormattedValue Is DBNull.Value)) Then
If CStr(row.Cells(column.Index).FormattedValue) = CStr(String.Format("{0:n1}", vals(j))) Then
row.Cells(column.Index).Style.BackColor = colors(vals.GetUpperBound(0) - j)
End If
End If
Next
Next
Case "a"
' First de-colorize the row
For Each row As DataGridViewRow In dgv.Rows
row.Cells(column.Index).Style.BackColor = dgv.Columns(column.Index).DefaultCellStyle.BackColor
Next
Dim lowCount As Integer = 2
If lowCount > vals.GetUpperBound(0) Then lowCount = vals.GetUpperBound(0)
For j As Integer = 0 To lowCount
For Each row As DataGridViewRow In dgv.Rows
If (Not (row.Cells(column.Index).FormattedValue Is DBNull.Value)) Then
If CStr(row.Cells(column.Index).FormattedValue) = CStr(String.Format("{0:n1}", vals(j))) Then
row.Cells(column.Index).Style.BackColor = colors(j)
End If
End If
Next
Next
Case Else
' do nothing
End Select
' Copy the highlighting rules from the EGB box to the EGL box if we're on the dgv
If dgv.Name = "dgvRace" Then
For i As Integer = 0 To dgv.Rows.Count - 1
dgv.Rows(i).Cells("effGradeLetter").Style = dgv.Rows(i).Cells("effGradeLarge").Style
Next
End If
' Update all the tooltips for each box
Dim places() As String = {"1st", "2nd", "3rd", "4th", "5th", "6th", "7th", "8th"}
For Each row As DataGridViewRow In dgv.Rows
' Update tooltiptext for each row
Dim place As Integer = FindIndexInArray(vals, row.Cells(column.Index).FormattedValue)
If place > -1 Then
Dim placeStr As String = IIf(column.ToolTipText.ToLower() = "d", places(vals.GetUpperBound(0) - place), places(place))
'If column.ToolTipText.ToLower() = "d" Then place = vals.GetUpperBound(0) - place
row.Cells(column.Index).ToolTipText = String.Format("Column Place {0}", placeStr)
If row.Cells(column.Index).Value.GetType().ToString() = "System.Single" Or row.Cells(column.Index).Value.GetType().ToString() = "System.Int32" Then
' Get upper/lower difference if available
If place > 0 Then
Dim distFromPlaceBefore As Single = Math.Abs(CSng(vals(place)) - CSng(vals(place - 1)))
Dim distFromFirstPlace As Single = Math.Abs(CSng(vals(place)) - CSng(vals(0)))
row.Cells(column.Index).ToolTipText &= ControlChars.CrLf & String.Format(" - Distance from {0}: {1:n1}; Distance from 1st: {2:n1}", places(place - 1), distFromPlaceBefore, distFromFirstPlace)
End If
If place < vals.GetUpperBound(0) Then
Dim distFromPlaceAfter As Single = Math.Abs(Math.Round(CSng(vals(place)) - CSng(vals(place + 1)), 1))
Dim distFromLastPlace As Single = Math.Abs(Math.Round(CSng(vals(place)) - CSng(vals(vals.GetUpperBound(0))), 1))
row.Cells(column.Index).ToolTipText &= ControlChars.CrLf & String.Format(" - Distance from {0}: {1:n1}; Distance from {3}: {2:n1}", places(place + 1), distFromPlaceAfter, distFromLastPlace, places(vals.GetUpperBound(0)))
End If
End If
End If
Next
End If
Next
更新:どうにかして列とソース グリッドをアタッチして、値を取得し、色付けの決定に必要なものを取得できますか?