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

