[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
完成之後,我們就能取得資料庫的對應類別,如下圖:
這個類別基本上不要去動它,以免資料庫異動,需要透過工具重新產生
我們應該為 Employee 建立一個 EmployeeMetadata 類別
PS.有沒有 MetadataTypeAttribute 在這篇沒有影響
這時候綁定資料並沒有改變 DisplayName
{
new Employee {Id = 1, UserId = "yao", Password = "1234"}
};
綁定之前,將它們倆個關聯起來即可
var metadataType = typeof(Employee.EmployeeMetadata);
TypeDescriptor.AddProviderTransparent(
new AssociatedMetadataTypeTypeDescriptionProvider(type, metadataType), type);
再次執行時,綁定時就會套用 DisplayName、Browsable
觀察關聯 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