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

如何将Devexpress Grid中动态唯一的行转换为列?

DevExpress Grid 运行时行转列实现方案

核心思路

将原数据中唯一的Period值作为动态列,把对应行的数值映射到新列中,本质是通过数据透视转换结合DevExpress Grid的动态列创建能力实现,适配Period数量变化的场景。

具体实现步骤

1. 定义数据结构

先准备原始数据实体,再创建支持动态属性的转换后实体,用来存储固定列和动态Period列的数据:

// 原始数据实体
public class OriginalData
{
    public string Category { get; set; } // 示例固定列,根据你的实际数据调整
    public string Period { get; set; }
    public decimal Value { get; set; }
}

// 转换后的动态数据实体
public class PivotData
{
    public string Category { get; set; }
    private Dictionary<string, decimal> _periodValues = new();

    // 通过索引器访问动态Period的值
    public decimal this[string period]
    {
        get => _periodValues.TryGetValue(period, out var val) ? val : 0;
        set => _periodValues[period] = value;
    }
}

2. 数据透视转换

遍历原始数据,按固定列分组,将每个Period的值映射到对应分组的动态对象中:

public List<PivotData> ConvertToPivot(List<OriginalData> originalList)
{
    var pivotList = new List<PivotData>();
    // 按固定列分组,这里以Category为例
    var groupedData = originalList.GroupBy(d => d.Category);

    foreach (var group in groupedData)
    {
        var pivotItem = new PivotData { Category = group.Key };
        foreach (var item in group)
        {
            pivotItem[item.Period] = item.Value;
        }
        pivotList.Add(pivotItem);
    }

    return pivotList;
}

3. 运行时生成Grid列

获取所有唯一的Period值,动态创建Grid列并绑定转换后的数据源:

// 假设你已获取原始数据集合originalData
var allPeriods = originalData.Select(d => d.Period).Distinct().ToList();

// 清空Grid现有列(按需执行)
gridView1.Columns.Clear();

// 添加固定列
var fixedColumn = new GridColumn
{
    FieldName = "Category",
    Caption = "分类",
    Visible = true
};
gridView1.Columns.Add(fixedColumn);

// 动态添加Period列
foreach (var period in allPeriods)
{
    var periodColumn = new GridColumn
    {
        FieldName = $"[{period}]", // 对应PivotData的索引器
        Caption = period,
        Visible = true,
        ColumnEdit = new SpinEdit() // 数值类型列用SpinEdit,可根据数据类型调整
    };
    gridView1.Columns.Add(periodColumn);
}

// 绑定转换后的数据源
gridControl1.DataSource = ConvertToPivot(originalData);

4. 可选优化

  • 若想简化动态属性处理,可改用ExpandoObject,直接通过属性名绑定列:
    var expando = new ExpandoObject() as IDictionary<string, object>;
    expando["Category"] = group.Key;
    foreach (var item in group)
    {
        expando[item.Period] = item.Value;
    }
    
  • 若数据源动态更新(比如新增Period),将上述列创建和数据转换逻辑封装成方法,更新时重新调用即可。

内容的提问来源于stack exchange,提问作者maytas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 21:47:10