首页 > 解决方案 > 在 Devexpress Gridcontrol 绑定中使用 nameof 指定 FieldName

问题描述

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

由于属性名称被硬编码到form.designer.cs文件中的字符串中,因此很难通过重构来获取。我使用 Resharper,我知道您可以选择该框以在字符串文字中进行搜索,但是当文本在我的项目中以不相关的字符串文字出现数百次时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);

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

有什么方法可以为 Devexpress 字段名称使用 nameof 表达式?

标签: c#winformsdevexpressnameof

解决方案


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

InitializeComponent 方法中的代码由设计者生成,不应手动修改

这种限制的主要原因是Code-Dom 序列化基础结构是基于С#/VB 语法的受限子集。因此它不支持某些特定的语言功能,例如nameof. 查看CSharpCodeProvider以了解允许使用哪些表达式或联系Visual Studio 团队以获取更多信息。

关于 DevExpres GridControl 列的自定义,我建议您考虑GridControl支持广泛的注释属性这一事实,它允许您指定如何显示、格式化和验证您的列,而无需设计时自定义。您应该只在 DTO 级别应用特定注释,然后将这些对象集合直接分配给 GridControl 的 DataSource 属性:

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

推荐阅读