【问题标题】:Customise the display of a auto-generated class自定义自动生成的类的显示
【发布时间】:2013-09-29 06:09:53
【问题描述】:

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

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

如何进行自定义?还有其他方法吗?我应该采取什么方式以及如何采取?

编辑:忘了提及:我使用的是 winforms,但如果它可以简化事情,我将转向 WPF。

【问题讨论】:

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


    【解决方案1】:

    您可以在运行时通过手动注册 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,但请记住,设置/取消设置它适用于整个应用程序域,因此需要考虑线程。

    【讨论】:

    • FooFooMetadata 类型是否自动生成?!
    • 当我使用这种模式时,Foo 是 linq2sql 自动生成的类型,FooMetadata 是手动创建的,带有用于显示和验证的数据注释。我使用单元测试来标记这两种类型的属性的任何差异,这样它们就不会被忽视。
    • 我想知道,为什么 TypeDescriptor.RemoveProviderTransparent 对我不起作用...有什么建议吗?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      为什么不能在运行时使用数据网格视图的 Columns 集合来更改 DisplayNames 和 Visibles?

      【讨论】:

      • 我可以。它只需要大量难以管理的代码,复杂的查询会让人头疼。
      • 但是你可能会在你的软件中添加一个模块来专门管理这些事情......
      猜你喜欢
      • 1970-01-01
      • 2021-02-22
      • 1970-01-01
      • 2017-08-25
      • 1970-01-01
      • 1970-01-01
      • 2018-08-12
      • 2015-06-24
      • 2013-07-10
      相关资源
      最近更新 更多