[C#.NET][Winform] DataGridView Binding Metadata use TypeDescriptionProvider

[C#.NET][Winform] DataGridView Binding Metadata use TypeDescriptionProvider

為什麼要用 Metadata?

大部份的情況是用來擴充屬性(Property)的特性(Attribute)

什麼情況下需要用到 Metadata?

透過 Tool 幫我們產生的 POCO,為了避免與工具打架,所以另外建立一個部份類別(partial class)

Metadata 已經在 MVC 運行了一段時間,BLC 提供了相當多的 Metadata,若將 Metadata 的寫法抄到 Winform 是不行的,在這裡我透過 AssociatedMetadataTypeTypeDescriptionProvider 將 Metadata 關聯到原本的類別

使用步驟如下:


我在專案裡新增一個Service-based Database,並用 SSDT 將資料建立完成

再來,參考下方連結操作方式將資料庫欄位轉成類別(Code first from database)

http://www.dotblogs.com.tw/yc421206/archive/2014/03/18/144430.aspx

 

完成之後,我們就能取得資料庫的對應類別,如下圖:

這個類別基本上不要去動它,以免資料庫異動,需要透過工具重新產生

image

 

我們應該為 Employee 建立一個 EmployeeMetadata 類別

PS.有沒有 MetadataTypeAttribute 在這篇沒有影響

image

 

這時候綁定資料並沒有改變 DisplayName

{
    new Employee {Id = 1, UserId = "yao", Password = "1234"}
};

 

 

 

 

image

 

綁定之前,將它們倆個關聯起來即可

var metadataType = typeof(Employee.EmployeeMetadata);
TypeDescriptor.AddProviderTransparent(
    new AssociatedMetadataTypeTypeDescriptionProvider(type, metadataType), type);

 

 

再次執行時,綁定時就會套用 DisplayName、Browsable

image

 

 

觀察關聯 Metadata 後的結果

{
    var properties = new AssociatedMetadataTypeTypeDescriptionProvider(
        typeof(T)).GetTypeDescriptor(typeof(T)).GetProperties();

    foreach (PropertyDescriptor property in properties)
    {
        var name = property.Name;
        var required = property.Attributes.OfType<RequiredAttribute>().FirstOrDefault();
        var displayName = property.Attributes.OfType<DisplayNameAttribute>().FirstOrDefault();
        var stringLength = property.Attributes.OfType<StringLengthAttribute>().FirstOrDefault();

        Console.WriteLine("Property Name :{0}", name);
        Console.WriteLine("required :{0}", required);
        Console.WriteLine("displayName :{0}", (displayName != null) ? displayName.DisplayName : null);
        Console.WriteLine("stringLength Max:{0}", (stringLength != null) ? (int?)stringLength.MaximumLength : null);
    }
}

 

  


本文出自:http://www.dotblogs.com.tw/yc421206/archive/2014/11/10/147258.aspx

範例下載:https://dotblogsamples.codeplex.com/SourceControl/latest#Simple.Metadata%20for%20Wimform/

參考資料:

http://www.cnblogs.com/xling/archive/2013/01/25/2877071.html

http://www.dotblogs.com.tw/sam319/archive/2010/07/07/16437.aspx

http://stackoverflow.com/questions/19075036/customise-the-display-of-a-auto-generated-class

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo