如何将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
相关产品推荐
相关产品推荐

