自定义自动生成的类的显示

本文关键字:显示 自定义 自动生成 | 更新日期: 2023-09-27 18:33:07

我有一个数据库,我创建了类来使用 SQLMetal 访问/管理它。现在,我使用 LINQ to SQL,并希望在数据网格视图中显示查询结果。当我这样做时,列以我在数据库表中的列命名,并显示所有属性。我知道我可以通过使用DisplayNameBrowseable属性来更改它,但由于类是自动生成的,我不能只在需要的地方添加此属性。我想出了三种解决方法:

  1. 创建一个采用我的类的Adopter。我仍然不确定您如何为这种情况制作采用者。
  2. 创建另一个程序,该程序将在生成将添加属性的代码后运行。 这似乎是一个黑客,我更喜欢在功能和 GUI 之间分开,所以这种方法被搁置了。
  3. 使用 MetaDataType 属性。我无法让它工作,据我所知,它要求类和元数据类将位于同一个 DLL 中。

如何进行定制? 还有别的办法吗?我应该采取什么方法以及如何采取?

编辑:忘了提:我正在使用winforms,但如果它会简化事情,我将转向WPF。

自定义自动生成的类的显示

可以通过手动向类型描述符注册类型元数据类型,在运行时设置该类型元数据类型。

大概是这样的。

var type = typeof(Foo);
var metadataType = typeof(FooMetadata);
TypeDescriptor.AddProviderTransparent(new AssociatedMetadataTypeTypeDescriptionProvider(type, metadataType), type);

为了在上下文中显示所有内容,这将在数据网格中显示标题为"自定义栏"的单个列。

public class Foo
{
    public string Bar { get; set; }
    public string DontShowMe { get; set; }
}
public class FooMetadata
{
    [DisplayName("Custom Bar")]
    public string Bar { get; set; }
    [Browsable(false)]
    public string DontShowMe { get; set; }
}
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        var type = typeof(Foo);
        var metadataType = typeof(FooMetadata);
        TypeDescriptor.AddProviderTransparent(new AssociatedMetadataTypeTypeDescriptionProvider(type, metadataType), type);
        this.dataGridView1.DataSource = new List<Foo> { new Foo { Bar = "Foobar" } };
    }
}

如果您想随时随地切换元数据类型,这也是一个TypeDescriptor.RemoveProviderTransparent,但请记住,设置/取消设置它适用于整个应用程序域,因此需要考虑线程。

通过使用 WPF 数据网格,可以使用 AutoGeneratingColumn 事件轻松自定义自动生成的列。

为什么不能使用数据网格视图的列集合在运行时更改DisplayName s 和 Visible s?