ComponentEditor
“第二選擇”
上篇中,關於Editor說了那麼多,完了嗎?沒有,上篇僅僅介紹了操作屬性的UITypeEditor而已。還記得DataGrid的屬性窗口的下方的“屬性生成器...”嗎?
當我們點擊“屬生生成器...”後,IDE彈出一個窗體,提供我們全方位的操作DataGrid屬性的交互界面,這個界面比PropertyGrid提供更方便易用的,更符合DataGrid“國情”。所以,用戶有了屬性窗格之外的第二個選擇。
那麼這個“屬性生成器...”是什麼呢?它也是一個Editor,只是它不是一個UITypeEditor,而是一個ComponentEditor,對,它是一個組件編輯器,它不是用來編輯某個屬性的,而是用來操作整個控件的。
下面我們就以實例來看看要實現組件編輯器,要做哪些工作?
控件主體類
[
Designer(typeof(MyDesigner)),
Editor(typeof(MyComponentEditor), typeof(ComponentEditor))
]
public class MyControl :WebControl {
}
在這裡我們用到了兩個Attribute來描述我們的控件主體類:Designer和Editor,第一個為控件主體類關聯一個設計器,這裡之所以要用到設計器,因為要方便的調用組件編輯器要借助Designer類。第二個Attribute為控件主體類關聯了一個編輯器,大家可以看到它的第二個參數變成了ComponentEditor而不是UITypeEditor。
編輯器窗體類
public class MyComponentEditorForm : System.Windows.Forms.Form {
private MyControl _myControl;
public myControlComponentEditorForm(myControl component) {
InitializeComponent();
_myControl = component;
//用_myControl的屬性初始化本窗體上的操作控件(如一些TextBox,還以我以前講到的PropertyGrid的值)。
}
//以下是用戶點擊確定完成編輯的邏輯綱要
private void okButton_Click(object sender, System.EventArgs e) {
這裡使用PropertyDescriptor來為Component賦值與直接用 _myControl.Property_1 = textBox1.Text 這樣的邏輯來賦值有一個好處,就是支持操作的Undo功能#region 這裡使用PropertyDescriptor來為Component賦值與直接用 _myControl.Property_1 = textBox1.Text 這樣的邏輯來賦值有一個好處,就是支持操作的Undo功能
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(_myControl);
try {
PropertyDescriptor property_1 = props["Property_1"];
if (textProperty != null) {
textProperty.SetValue(_myControl, textBox1.Text);
}
}
catch {
}
DialogResult = DialogResult.OK;
Close();
#endregion
}
}