上一章遺留的DefaultValueAttribute問題,還沒有找到問題所在,我會繼續查找資料,找到後會及時 補上。
今天我們講Component
Property Editor UI,在vs環境中Property Editor有兩種,一種是vs自帶的 ,一種是Component編寫者根據自己需求而重新編寫的。在本章中我們這兩種都會進行一個簡單的學習, vs自帶的主要講Collection Editor。
先來回顧下我們上章沒有講的幾個PropertyAttribute:
EditorAttribute:指定Property Editor使用的編輯器。
DesignerSerializationVisibilityAttribute:指定通過Property Editor得到的結果是否保存在代碼 中。
LocalizableAttribute:用戶要本地化某個窗體時,任何具有該特性的屬性都將自動永久駐留到資源 文件中。
代碼實例如下,請注意代碼中注釋說明。
using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Drawing;
using System.Drawing.Design;
using System.Windows.Forms;
using System.Windows.Forms.Design;
namespace Components
{
// 這個例子用到了vs 2005裡的List<>,如果vs 2003的朋友請自己去實做 StudentCollection。
// 只要讓Property的類型為繼承IList的類型,其Property Editor UI都可以用vs自帶的。
public class Demo3 : Component
{
public Demo3()
{
_students = new List<Student>(); // 一定要在構造函數中實例話 _students。
}
private List<Student> _students;
private string _grade;
// vs 自帶的Editor。
// 如果沒有DesignerSerializationVisibilityAttribute的話,對Students設值,值不 能被保存。
// 大家可以把DesignerSerializationVisibilityAttribute注釋掉,對Students設值後 ,關閉vs環境,再重新打開項目,觀察Students的值沒有被保存下來。
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public List<Student> Students
{
get { return _students; }
set { _students = value; }
}
// 用戶自定義Editor。
[Editor(typeof(GradeEditor), typeof(UITypeEditor)), LocalizableAttribute (true)]
public string Grade
{
get { return _grade; }
set { _grade = value; }
}
}
public class Student
{
private int _id;
private string _name;
public int Id
{
get { return _id; }
set { _id = value; }
}
public string Name
{
get { return _name; }
set { _name = value; }
}
}
public class StudentCollection : CollectionBase
{
}
public class GradeEditor : UITypeEditor
{
[System.Security.Permissions.PermissionSet (System.Security.Permissions.SecurityAction.Demand)]
public override System.Drawing.Design.UITypeEditorEditStyle GetEditStyle (System.ComponentModel.ITypeDescriptorContext context)
{
// UITypeEditorEditStyle有三種,Modal是彈出式,DropDown是下拉式,None 是沒有。
return UITypeEditorEditStyle.Modal;
}
[System.Security.Permissions.PermissionSet (System.Security.Permissions.SecurityAction.Demand)]
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
// 得到editor service,可由其創建彈出窗口。
IWindowsFormsEditorService editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
// context.Instance —— 可以得到當前的Demo3對象。
// ((Demo3)context.Instance).Grade —— 可以得到當前Grade的值。
frmGradeEditor dialog = new frmGradeEditor();
editorService.ShowDialog(dialog);
String grade = dialog.Grade;
dialog.Dispose();
return grade;
}
}
}
Property Editor效果如下:
隨文源碼:http://www.bianceng.net/dotnet/201212/662.htm