4

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

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

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

编辑:忘了提:我正在使用winforms,但如果它会简化事情,我将转向WPF。

4

3 回答 3

5

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

于 2013-10-07T03:36:46.463 回答
1

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

于 2013-10-08T03:44:54.587 回答
-1

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

于 2013-10-01T21:30:16.003 回答