如何通过列Key属性修改UltraGrid指定单元格及前一列单元格背景色
问题原因
你原有代码存在两个核心问题:
- 误用
Exit For:只要遍历到你指定排除的列就直接终止整个循环,后续所有列都不会被处理,应该改为Continue For仅跳过当前排除列 - 列索引不可靠:如果允许用户拖拽调整UltraGrid的列显示顺序,
Index属性会跟随显示顺序变化,无法准确取到逻辑上的前一列,用Key属性匹配更稳定
解决方案
方案1:列顺序固定场景(修复原有逻辑即可)
如果列的显示顺序不会被调整,修复循环逻辑和索引越界问题就可以正常运行
VB.NET 代码
For Each column As UltraGridColumn In ugResult.DisplayLayout.Bands(0).Columns ' 跳过指定排除列,不要用Exit For终止循环 If {"K_Art", "UANR", "Ueberbegriff", "Benennung", "Anzahl", "Einheit", "Einzelkosten", "Sumcode", "Status"}.Contains(column.Key) Then Continue For End If ' 确保前一列索引合法,避免第一列报错 If column.Index > 0 AndAlso e.Row.Cells(column.Key).Value IsNot Nothing Then e.Row.Cells(column.Key).Appearance.BackColor = Color.Yellow e.Row.Cells(column.Index - 1).Appearance.BackColor = Color.Yellow End If Next
C# 代码
foreach (UltraGridColumn column in ugResult.DisplayLayout.Bands[0].Columns) { // 跳过指定排除列 if (new[] {"K_Art", "UANR", "Ueberbegriff", "Benennung", "Anzahl", "Einheit", "Einzelkosten", "Sumcode", "Status"}.Contains(column.Key)) { continue; } // 避免第一列索引越界 if (column.Index > 0 && e.Row.Cells[column.Key].Value != null) { e.Row.Cells[column.Key].Appearance.BackColor = Color.Yellow; e.Row.Cells[column.Index - 1].Appearance.BackColor = Color.Yellow; } }
方案2:列顺序可调整场景(纯Key匹配,不依赖索引)
提前建立需要处理的列和对应前一列的Key映射关系,完全不受列显示顺序调整的影响
VB.NET 代码
' 定义映射:键为需要着色的列Key,值为对应要同步着色的前一列Key,按需补充所有列即可 Dim columnMap As New Dictionary(Of String, String) From { {"需要着色列1的Key", "对应前一列1的Key"}, {"需要着色列2的Key", "对应前一列2的Key"} } For Each column As UltraGridColumn In ugResult.DisplayLayout.Bands(0).Columns If columnMap.ContainsKey(column.Key) AndAlso e.Row.Cells(column.Key).Value IsNot Nothing Then e.Row.Cells(column.Key).Appearance.BackColor = Color.Yellow e.Row.Cells(columnMap(column.Key)).Appearance.BackColor = Color.Yellow End If Next
C# 代码
// 定义列映射:键是需要着色的列Key,值是对应要同步着色的前一列Key,按需补充所有列即可 Dictionary<string, string> columnMap = new Dictionary<string, string> { {"需要着色列1的Key", "对应前一列1的Key"}, {"需要着色列2的Key", "对应前一列2的Key"} }; foreach (UltraGridColumn column in ugResult.DisplayLayout.Bands[0].Columns) { if (columnMap.ContainsKey(column.Key) && e.Row.Cells[column.Key].Value != null) { e.Row.Cells[column.Key].Appearance.BackColor = Color.Yellow; e.Row.Cells[columnMap[column.Key]].Appearance.BackColor = Color.Yellow; } }
备注:如果你的单元格着色逻辑是其他地方提前完成的,只需要同步前一列颜色,把判断条件里的
Value != null改为判断e.Row.Cells(column.Key).Appearance.BackColor是否为你设置的目标颜色即可。
内容的提问来源于stack exchange,提问作者user17151986
相关产品推荐
相关产品推荐

