2013-09-29 37 views
3

我有一個數據庫,我創建了類來訪問/使用SQLMetal來管理它。現在,我使用LINQ to SQL,並且想要在數據網格視圖中顯示查詢的結果。當我這樣做時,這些列將在數據庫表中的列中命名,並顯示所有屬性。我知道我可以通過使用DisplayNameBrowseable屬性來更改此屬性,但因爲這些類是自動生成的,所以我不能只在需要時添加此屬性。我想出了三種解決方法:自定義顯示自動生成的類

  1. 創建一個Adopter採用我的類。我仍然不確定你是如何爲這種情況制定採用者的。
  2. 創建另一個程序,該程序在生成將添加屬性的代碼之後運行。這看起來像一個黑客攻擊,我更喜歡將功能和GUI分開,所以這種方法處於暫停狀態。
  3. 使用MetaDataType屬性。我無法得到這個工作,並且據我所知,它需要類和元數據類將在同一個DLL中。

如何進行自定義?有另一種方法嗎?我應該採取什麼方式以及如何?

編輯:忘記提及:我使用winforms,但如果它將簡化的事情,我會轉移到WPF。

回答

-1

爲什麼不能在運行時使用數據網格視圖的Columns集合來更改DisplayNameVisible

+0

我可以。它只是需要很多難以管理的代碼,而複雜的查詢會導致一陣痛苦。 – elyashiv

+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

+0

是否有'Foo'和'FooMetadata'類型自動生成?! –

+0

當我使用這種模式時,Foo是由linq2sql自動生成的類型,FooMetadata是使用數據註釋手動創建的,用於顯示和驗證。我使用單元測試來標記兩種類型屬性的差異,以免它們不被注意。 –

+0

我想知道,爲什麼TypeDescriptor.RemoveProviderTransparent不適合我......任何建議? –