You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过列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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 18:36:01