程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> .NET組件編程(3) Property Editor

.NET組件編程(3) Property Editor

編輯:關於.NET

上一章遺留的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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved