我有一个数据库,我创建了一些类来使用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,但请记住,设置/取消设置它适用于整个应用程序域,因此需要考虑线程.