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

时间:2013-09-29 06:09:53

标签: c# linq-to-sql datagridview auto-generate

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

  1. 创建Adopter以采用我的课程。我还不确定你为这个案子做了多少采用者。
  2. 创建另一个程序,该程序将在生成将添加属性的代码之后运行。这看起来像是一个黑客,我更喜欢在功能和GUI之间分开,所以这个方法处于暂停状态。
  3. 使用MetaDataType属性。我无法让它工作,据我所知,它需要类和元数据类在同一个DLL中。
  4. 如何进行自定义?有另一种方式吗?我应该采取什么方式以及如何进行?

    编辑:忘记提及:我使用的是winforms,但如果它会简化,我会转到WPF。

3 个答案:

答案 0 :(得分:4)

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

这就是这样的。

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

答案 1 :(得分:1)

通过使用WPF DataGrid,您可以使用AutoGeneratingColumn事件轻松自定义自动生成的列。

答案 2 :(得分:-1)

为什么不能使用数据网格视图的Columns集合在运行时更改DisplayNameVisible