none
在我的WinForm裡放了一個PropertyGrid物件,請問在runtime時如何讓PropertyGrid顯示其他Control的擴展屬性(ProvideProperty)? RRS feed

  • 問題

  • 以下是我的範例程式碼,如果我在Visual Studio 2005設計Winform的畫面中拉一個MyPanel進來,並在其上放置一個Label,當我選取該Label物件時,屬性視窗會顯示該物件的屬性另附加上ControlIndex屬性,但是我實際執行範例程式時,在執行時期的Propertygrid物件裡,會顯示label2物件的屬性,可是沒有附加上ControlIndex屬性。請問我該如何修改,才能讓Runtime的Propertygrid顯示物件的附加屬性?

     

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

     

    namespace TestProvideProperty
    {
        public partial class Form1 : Form
        {
            private PropertyGrid propertyGrid1 = new PropertyGrid();

     

            public Form1()
            {
                InitializeComponent();

     

                propertyGrid1.Dock = DockStyle.Fill;
                this.Controls.Add(propertyGrid1);
            }

     

            private void Form1_Load(object sender, EventArgs e)
            {
                MyPanel panel1 = new MyPanel();
               
                Label label1 = new Label();
                label1.Text = "標籤1";
                panel1.Controls.Add(label1);

     

                Label label2 = new Label();
                label2.Text = "標籤2";
                panel1.Controls.Add(label2);

     

                propertyGrid1.SelectedObject = label2;
            }
        }

     

        [ProvideProperty("ControlIndex", typeof(Control))]
        public class MyPanel : Panel, IExtenderProvider
        {
            [DisplayName("ControlIndex")]
            public int GetControlIndex(Control sender)
            {
                return this.Controls.GetChildIndex(sender);
            }

     

            [DisplayName("ControlIndex")]
            public void SetControlIndex(Control sender, int value)
            {
                this.Controls.SetChildIndex(sender, value);
            }

     

            bool IExtenderProvider.CanExtend(object extendee)
            {
                Control c = extendee as Control;
                if (c != null)
                {
                    return (c.Parent == this);
                }
                return false;
            }
        }
    }

     

    • 已移動 璉璉 2010年2月27日 下午 03:55 (從:Visual Studio一般討論區(General))
    2007年11月28日 上午 06:18

解答

所有回覆

  • 給妳參考看看  ︿︿

    1.

    Getting to know IExtenderProvider

    http://www.codeproject.com/dotnet/iextenderprovider.asp

     

    2.

    為現有的物件擴充屬性 IExtenderProvider

    • 已標示為解答 璉璉 2010年2月27日 下午 03:55
    2007年11月29日 上午 02:38
  • 謝謝您的回覆

    CodeProject上關於IExtenderProvider的文章我已參考很多,包括這篇

    我的範例程式也做出了實作IExtenderProvider的MyPanel物件,

    在Vistual Studio 2005的DesignTime加入MyPanel,在MyPanel裡的Control皆會被附加上ControlIndex屬性沒有問題,

    但是我的問題是

    在runtime(不是在Vistual Studio 2005的屬性視窗)的PropertyGrid物件裡,並不會附加上ControlIndex屬性

    以上這篇文章只提到利用paint事件可讓物件在DesignTime和RunTime因擴充屬性而樣子不一樣,

    但沒提到在Runtime的PropertyGrid就不會顯示擴充屬性的問題,

    會不會是IExtenderProvider只提供DesignTime支援啊,在RunTime的物件要顯示擴充屬性就要另外寫?

     

    2007年11月29日 上午 03:15