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

C# DevExpress:如何实现列中每个单元格自定义显示格式?

在C# DevExpress中实现列的每个单元格独立显示格式

问题说明

我需要让DevExpress GridControl列中的每个单元格拥有独立的显示格式,但当前绑定方式仅以第一个元素为基准,无法实现需求。已经在网络上查找过相关方案,但没有找到可行的解决办法。

当前使用的代码如下:

var col = new GridColumn {
    Header = "value",
    Binding = new Binding {
        Path = new PropertyPath(
            $"{nameof(DivisionRegionTimingVM.Months)}[{monthIndex}]." +
            $"{nameof(DivisionTimingMonthVM.Week)}[{weekIndex}]." +
            $"{nameof(DivisionTimingWeekVM.Value)}"
        ),
        Mode = BindingMode.OneWay
    }
};

col.SetBinding(
    ColumnBase.EditSettingsProperty,
    new Binding {
        Source = _division,
        Path = new PropertyPath(
            $"{nameof(DivisionRegionTimingVM.Months)}[{monthIndex}]." +
            $"{nameof(DivisionTimingMonthVM.Week)}[{weekIndex}]." +
            $"{nameof(DivisionTimingWeekVM.EditSettings)}"
        )
    }
);

期望的显示效果(表格示例):
| | |月份_____|月份|
| 姓名 | 名称 |日期|日期|日期
|日期|日期|日期
_|
| | 变动项 | 数值 | 数值 | 数值 | 数值 | 数值 | 数值 |
|||||||||
| |增长值
|170|170|170|170|170|170|
| |__体重|72|75|73|71|68|70|
| 大卫 |20
|20%|20%|20%|20%|20%|20%|
|
___|10|80%|80%|80%|80%|80%|80%|

解决方案

方案1:通过CellStyle绑定单元格级格式(推荐)

不要给列直接绑定EditSettings,而是利用CellStyle绑定每个单元格的格式属性。首先在DivisionTimingWeekVM中添加DisplayFormat属性(存储格式字符串,如"N2"、"P0"),然后修改列的CellStyle:

var col = new GridColumn {
    Header = "value",
    Binding = new Binding {
        Path = new PropertyPath(
            $"{nameof(DivisionRegionTimingVM.Months)}[{monthIndex}]." +
            $"{nameof(DivisionTimingMonthVM.Week)}[{weekIndex}]." +
            $"{nameof(DivisionTimingWeekVM.Value)}"
        ),
        Mode = BindingMode.OneWay
    }
};

// 为单元格设置动态格式
col.CellStyle = new Style(typeof(GridCellContentPresenter))
{
    Setters = {
        new Setter(TextBlock.TextProperty, new Binding {
            Path = new PropertyPath(
                $"{nameof(DivisionRegionTimingVM.Months)}[{monthIndex}]." +
                $"{nameof(DivisionTimingMonthVM.Week)}[{weekIndex}]." +
                $"{nameof(DivisionTimingWeekVM.Value)}"
            ),
            StringFormat = new Binding {
                Path = new PropertyPath(
                    $"{nameof(DivisionRegionTimingVM.Months)}[{monthIndex}]." +
                    $"{nameof(DivisionTimingMonthVM.Week)}[{weekIndex}]." +
                    $"{nameof(DivisionTimingWeekVM.DisplayFormat)}"
                )
            }
        })
    }
};

方案2:利用CustomColumnDisplayText事件动态生成显示文本

通过GridControl的CustomColumnDisplayText事件,根据当前行的数据动态设置单元格的显示内容:

// 注册事件
gridControl.CustomColumnDisplayText += GridControl_CustomColumnDisplayText;

// 事件处理逻辑
private void GridControl_CustomColumnDisplayText(object sender, CustomColumnDisplayTextEventArgs e)
{
    if (e.Column.Header.ToString() == "value")
    {
        var rowVM = e.Row as DivisionRegionTimingVM;
        if (rowVM != null)
        {
            var weekVM = rowVM.Months[monthIndex].Week[weekIndex];
            e.DisplayText = string.Format(weekVM.DisplayFormat, weekVM.Value);
        }
    }
}

原代码失效原因

原代码将列的EditSettingsProperty绑定到单个EditSettings实例,导致整列共用同一套格式设置。要实现单元格独立格式,必须将格式逻辑绑定到行数据的单元格级属性,而非列级别的统一配置。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:01:43