在 Devexpress Gridcontrol 绑定中使用 nameof 指定 FieldName

Using nameof for specifying FieldName in Devexpress Gridcontrol binding

我在我的应用程序中使用 Devexpress Gridcontrol,它的开发速度非常快,随着需求变得更加清晰/发展,这通常涉及重构、更改 属性 名称等。

因为 属性 名称被硬编码到 form.designer.cs 文件中的字符串中,这使得重构变得非常困难。我使用 Resharper,我知道你可以 select 框来搜索字符串文字,但是当文本是 DescriptionManufacturer 时,它会在我的不相关字符串文字中出现数百次项目,因此以这种方式实施将非常耗时,坦率地说是浪费时间。

使用 nameof 运算符提供了显式指定字段名称之间的桥梁,同时还为重构提供开箱即用的支持。

从我的设计器文件中获取此片段。

// 
// colManufacturer
// 
this.colManufacturer.Caption = "Manufacturer";
this.colManufacturer.ColumnEdit = this.xrefManufacturerSearch;
this.colManufacturer.FieldName = "Manufacturer";
this.colManufacturer.Name = "colManufacturer";
this.colManufacturer.Visible = true;
this.colManufacturer.VisibleIndex = 1;

如果我将 FieldName 属性替换为

this.colManufacturer.FieldName = nameof(CrossRef.Manufacturer);

但现在我无法打开此表单的设计器,错误代码为“设计器无法在第 125 行处理未知名称 nameof”。InitializeComponent 方法中的代码由设计器生成,不应手动生成已修改。

Devexpress 字段名称有没有使用 nameof 表达式的方法?

您永远不应该在 *.designer.cs 文件中进行任何重构,因为

The code within the method InitializeComponent is generated by the designer and should not be manually modified

此限制的主要原因Code-Dom serialization infrastructure is based on the restricted subset of С#/VB syntax. Thus it does not support some specific language features e.g. nameof. Take a look at the CSharpCodeProvider to learn which expressions are allowed or contact the Visual Studio Team了解更多信息。

关于 DevExpres GridControl 列自定义,我建议您考虑以下事实:GridControl supports the wide range of annotation attributes 允许您指定如何显示、格式化和验证列,而无需设计时自定义。您应该只在 DTO 级别应用特定注释,然后将这些对象集合直接分配给 GridControl 的数据源 属性:

public class CrossRef{
    [Display(Name = "MANUFACTURER")]
    [...]
    public string Manufacturer { get; set; }
}
// ...
gridControl1.DataSource = new BindingList<CrossRef> {
    new CrossRef() { Manufacturer = ... },
    ...
};