当前位置:编程学习 > C#/ASP.NET >>

很偏门的问题,特来高手多多的c#版求教:如何动态给PropertyGrid1加载属性

缘由,我写一个控件,比较复杂,而且一些对这个控件的设置功能,不是很常用,所有我决定把这些属性写成设计时属性。
这本来也不是问题,继承   ControlDesigner 写个设计机,就可以动态加载属性了。但按自己比较贪心点,我创建一个窗体(frmTest),然后在上面添加一个PropertyGrid1 属性网格,然后给控件添加智能标志菜单,这个菜单功能就弹出这个窗体,供人设置这个控件的属性。但我发现,动态添加的属性,在vs设计环境里面的属性网格,可以正常加载这个动态属性,但在我的窗口,就不能正常加载,不知道啥原因,我试了好久,就是没能够在属性网格动态显示属性?
如下面图片

--------------------编程问答--------------------

'这是设计机的代码

Imports System.ComponentModel
Imports System.ComponentModel.Design
Imports System.Windows.Forms
Imports System.Windows.Forms.Design

Public Class ItemDesign2
    Inherits ControlDesigner
    '添加谓词
    Public Overrides ReadOnly Property Verbs() As System.ComponentModel.Design.DesignerVerbCollection
        Get
            'Return MyBase.Verbs
            Dim myVerbs As DesignerVerbCollection = New DesignerVerbCollection  'MyBase.Verbs
            Dim CreateTableVer = New DesignerVerb("创建表格", AddressOf CreateTable)
            myVerbs.Add(CreateTableVer)

            Return myVerbs
        End Get
    End Property
    Sub CreateTable()
        Dim frm As New frmTest(New item)
        frm.ShowDialog()
    End Sub
    Protected Overrides Sub PostFilterProperties(ByVal properties As System.Collections.IDictionary)
        MyBase.PostFilterProperties(properties)
        Dim pd As PropertyDescriptor = TypeDescriptor.CreateProperty( _
GetType(itemdesign), _
"OutlineColor", _
GetType(System.Drawing.Color), _
New Attribute() {New DesignOnlyAttribute(True)})

        properties.Add("OutlineColor", pd)
    End Sub
End Class




'这是测试控件
Imports System.ComponentModel.Design
Imports System.ComponentModel
Imports System.Windows.Forms
Imports System.Windows.Forms.Design

<Designer(GetType(ItemDesign2))> _
Public Class item
    Inherits Control


    Private _age As String
    Private _Caption As String
    Private _ID As Int32



    Property age() As String
        Get
            Return _age
        End Get
        Set(ByVal value As String)
            _age = value
        End Set
    End Property

    Property caption() As String
        Get
            Return _Caption
        End Get
        Set(ByVal value As String)
            _Caption = value
        End Set
    End Property
    Property ID() As Int32
        Get
            Return _ID
        End Get
        Set(ByVal value As Int32)
            _ID = value
        End Set
    End Property

End Class




'这是一个测试窗体,里面只放一个属性网格
Public Class frmTest

    Private Sub frmitem_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub
    Private _item As item
    Public Sub New(ByVal item As item)

        ' 此调用是 Windows 窗体设计器所必需的。
        InitializeComponent()

        ' 在 InitializeComponent() 调用之后添加任何初始化。
        _item = item
        PropertyGrid1.SelectedObject = _item
    End Sub
End Class



还有一个form1窗体,在上面放一个item,item有智能标志,点击哪个创建表格菜单(忘记修改这个名字)就是可以弹出frmtest窗体,这时还是处于设计模式的 --------------------编程问答-------------------- http://download.csdn.net/detail/zhaigates/1081108 --------------------编程问答-------------------- 楼上提供的代码跟我想要实现的功能好像差很远?或是是我看得不是很懂把?
哪个例子的所谓动态属性其实是绑定到一个集合,而我并不需要。我的代码也实现动态加载属性,但只在vs自己的属性网格,郁闷 --------------------编程问答-------------------- --------------------编程问答-------------------- 走错地方了.这里是C# --------------------编程问答--------------------  c# 跟vb。net 师出同门,很多是相通的。在这里求教,是因为自己懂得底层的高手相对vb。net会更多点。 --------------------编程问答-------------------- 楼主是希望  PropertyGrid  控件,加载的数据是 自己定义的,而不是 只绑定一个 对象,自动就出现 数据的;

是不是这个意思??

——我可以欣慰的告诉楼主两哥消息:一个好消息,一个坏消息
算了,先说 坏消息吧:

打开 SQL Server 2008 ,任意找一个 数据表的 设计界面:你会看到 下面的 PropertyGrid  控件,展示的是数据列 的信息:(常规) (名称)  ——为什么,微软 要 将  "常规" 前后加括号,要在 "名称"前后加括号??
——因为不加括号, (名称)会跑到 默认值或绑定 下面去
——————————————————————————————————————————
就是说,PropertyGrid  这个控件,微软自己都连 他的属性顺序都控制不了,微软人员就更加 控制不了 动态添加 属性项了!!——微软人员都办不到,你怎么可以办到??


好消息是 第三方的 Dex 控件中,也有一个 PropertyGrid 控件,这个第三方的 属性控件 支持 手动添加 !!


————————————————————————————————————————————————
楼主的问题,我曾经也研究过:那时我是想仿写一个  SQL Server 2008 的客户端:
http://hi.baidu.com/my_responsibility/album/c%23%20sqlforever%20%A1%AA%A1%AA2011%CD%F5%C5%C6%CF%EE%C4%BF%D6%AE%D2%BB

写到这个 属性控件 时,也是没有办法——意外发现,微软 无能为力的这个细节

楼主,暂时认命吧....






--------------------编程问答--------------------  Dex 控件  又称  Dx 控件,楼主 疯狂 百度去吧..... --------------------编程问答-------------------- 楼主仔细看你自己的 截图:

VS 中: “设计”下面 的 那个 Name  ——也是加了括号的!

微软无能为力...... --------------------编程问答--------------------
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,