问题描述
缘由,我写一个控件,比较复杂,而且一些对这个控件的设置功能,不是很常用,所有我决定把这些属性写成设计时属性。这本来也不是问题,继承ControlDesigner写个设计机,就可以动态加载属性了。但按自己比较贪心点,我创建一个窗体(frmTest),然后在上面添加一个PropertyGrid1属性网格,然后给控件添加智能标志菜单,这个菜单功能就弹出这个窗体,供人设置这个控件的属性。但我发现,动态添加的属性,在vs设计环境里面的属性网格,可以正常加载这个动态属性,但在我的窗口,就不能正常加载,不知道啥原因,我试了好久,就是没能够在属性网格动态显示属性?如下面图片
解决方案
解决方案二:
'这是设计机的代码ImportsSystem.ComponentModelImportsSystem.ComponentModel.DesignImportsSystem.Windows.FormsImportsSystem.Windows.Forms.DesignPublicClassItemDesign2InheritsControlDesigner'添加谓词PublicOverridesReadOnlyPropertyVerbs()AsSystem.ComponentModel.Design.DesignerVerbCollectionGet'ReturnMyBase.VerbsDimmyVerbsAsDesignerVerbCollection=NewDesignerVerbCollection'MyBase.VerbsDimCreateTableVer=NewDesignerVerb("创建表格",AddressOfCreateTable)myVerbs.Add(CreateTableVer)ReturnmyVerbsEndGetEndPropertySubCreateTable()DimfrmAsNewfrmTest(Newitem)frm.ShowDialog()EndSubProtectedOverridesSubPostFilterProperties(ByValpropertiesAsSystem.Collections.IDictionary)MyBase.PostFilterProperties(properties)DimpdAsPropertyDescriptor=TypeDescriptor.CreateProperty(_GetType(itemdesign),_"OutlineColor",_GetType(System.Drawing.Color),_NewAttribute(){NewDesignOnlyAttribute(True)})properties.Add("OutlineColor",pd)EndSubEndClass
'这是测试控件ImportsSystem.ComponentModel.DesignImportsSystem.ComponentModelImportsSystem.Windows.FormsImportsSystem.Windows.Forms.Design<Designer(GetType(ItemDesign2))>_PublicClassitemInheritsControlPrivate_ageAsStringPrivate_CaptionAsStringPrivate_IDAsInt32Propertyage()AsStringGetReturn_ageEndGetSet(ByValvalueAsString)_age=valueEndSetEndPropertyPropertycaption()AsStringGetReturn_CaptionEndGetSet(ByValvalueAsString)_Caption=valueEndSetEndPropertyPropertyID()AsInt32GetReturn_IDEndGetSet(ByValvalueAsInt32)_ID=valueEndSetEndPropertyEndClass
'这是一个测试窗体,里面只放一个属性网格PublicClassfrmTestPrivateSubfrmitem_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.LoadEndSubPrivate_itemAsitemPublicSubNew(ByValitemAsitem)'此调用是Windows窗体设计器所必需的。InitializeComponent()'在InitializeComponent()调用之后添加任何初始化。_item=itemPropertyGrid1.SelectedObject=_itemEndSubEndClass
还有一个form1窗体,在上面放一个item,item有智能标志,点击哪个创建表格菜单(忘记修改这个名字)就是可以弹出frmtest窗体,这时还是处于设计模式的
解决方案三:
http://download.csdn.net/detail/zhaigates/1081108
解决方案四:
楼上提供的代码跟我想要实现的功能好像差很远?或是是我看得不是很懂把?哪个例子的所谓动态属性其实是绑定到一个集合,而我并不需要。我的代码也实现动态加载属性,但只在vs自己的属性网格,郁闷
解决方案五:
该回复于2012-01-17 09:02:29被版主删除
解决方案六:
走错地方了.这里是C
解决方案七:
#c#跟vb。net师出同门,很多是相通的。在这里求教,是因为自己懂得底层的高手相对vb。net会更多点。
解决方案八:
楼主是希望PropertyGrid控件,加载的数据是自己定义的,而不是只绑定一个对象,自动就出现数据的;是不是这个意思??——我可以欣慰的告诉楼主两哥消息:一个好消息,一个坏消息算了,先说坏消息吧:打开SQLServer2008,任意找一个数据表的设计界面:你会看到下面的PropertyGrid控件,展示的是数据列的信息:(常规)(名称)——为什么,微软要将"常规"前后加括号,要在"名称"前后加括号??——因为不加括号,(名称)会跑到默认值或绑定下面去——————————————————————————————————————————就是说,PropertyGrid这个控件,微软自己都连他的属性顺序都控制不了,微软人员就更加控制不了动态添加属性项了!!——微软人员都办不到,你怎么可以办到??好消息是第三方的Dex控件中,也有一个PropertyGrid控件,这个第三方的属性控件支持手动添加!!————————————————————————————————————————————————楼主的问题,我曾经也研究过:那时我是想仿写一个SQLServer2008的客户端: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——也是加了括号的!微软无能为力......
解决方案十一:
该回复于2012-02-02 09:04:30被版主删除