编程语言
首页 > 编程语言> > c#-自定义自动生成的类的显示

c#-自定义自动生成的类的显示

作者:互联网

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

>创建采用者以采用我的课程.我仍然不确定您在这种情况下如何准确地采用采用者.
>创建另一个程序,该程序将在添加属性的代码生成后运行.这似乎是一种hack,我更喜欢将功能和GUI分开,因此此方法处于保留状态.
>使用MetaDataType属性.我无法使它正常工作,据我所知,这要求这些类和元数据类必须位于同一DLL中.

我该如何定制?还有另一种方法吗?我应该采取什么方式?

编辑:忘记提及:我正在使用winforms,但如果它将简化事情,我将转到WPF.

解决方法:

您可以通过在TypeDescriptor中手动注册来在运行时设置类型元数据类型.

这样的事情.

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

为了在上下文中显示所有内容,这将在数据网格中显示标题为“ Custom Bar”的单个列.

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,但请记住,设置/取消设置它适用于整个应用程序域,因此需要考虑线程.

标签:linq-to-sql,datagridview,auto-generate,c
来源: https://codeday.me/bug/20191030/1967335.html