我有一个数据库,我使用SQLMetal
创建了访问/管理它的类。现在,我使用LINQ to SQL,我想在数据网格视图中显示查询结果。当我这样做时,列以DB表中的列命名,并显示所有属性。我知道我可以使用DisplayName
和Browseable
属性来更改此设置,但由于这些类是自动生成的,因此我无法在需要的地方添加此属性。我想出了三个解决方法:
Adopter
以采用我的课程。我还不确定你为这个案子做了多少采用者。 MetaDataType
属性。我无法让它工作,据我所知,它需要类和元数据类在同一个DLL中。如何进行自定义?有另一种方式吗?我应该采取什么方式以及如何进行?
编辑:忘记提及:我使用的是winforms,但如果它会简化,我会转到WPF。
答案 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集合在运行时更改DisplayName
和Visible
?