自定义自动生成的类的显示
本文关键字:显示 自定义 自动生成 | 更新日期: 2023-09-27 18:33:07
我有一个数据库,我创建了类来使用 SQLMetal
访问/管理它。现在,我使用 LINQ to SQL,并希望在数据网格视图中显示查询结果。当我这样做时,列以我在数据库表中的列命名,并显示所有属性。我知道我可以通过使用DisplayName
和Browseable
属性来更改它,但由于类是自动生成的,我不能只在需要的地方添加此属性。我想出了三种解决方法:
- 创建一个采用我的类的
Adopter
。我仍然不确定您如何为这种情况制作采用者。 - 创建另一个程序,该程序将在生成将添加属性的代码后运行。 这似乎是一个黑客,我更喜欢在功能和 GUI 之间分开,所以这种方法被搁置了。
- 使用
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?