自定义组件设计中,如何通过attribute,使arraylist型的属性在设计时可通过属性编辑器进行输入值

wintle 2004-08-01 05:28:20
在组件中一个Items,现拟采用ArrayList型存储(当然,如果不合适可以改哈),数据为一个简单的数据结构类,如
public class MyItem
{
private string m_name;
private string m_target;
public string Name
{
get {return m_name;}
set { m_name = value;}
}
public string Target
{
get {return m_target;}
set { m_target = value;}
}
}

在组件中
...
[DescriptionAttribute("数据项"),.?.]
public ArrayList Items
{
get { return m_items}
set { m_items = value;}
}
现在就是希望在上面"?"的地方指定当这个组件被设计器引用之后,在属性编辑器中,可以在这个Items后面有一个"..."的按钮,点击后,能够弹出一个经常能见到的编辑器(如RadioButtonList的Items被点开后的设置框,里面左边是一个个可以添加的ListItem,右边是这个ListItem的项(如Name,value,和checked)),然后可以添加、修改、删除Items。请问要怎么做才行!谢谢,请高手不吝教导啊!

...全文
224 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wintle 2004-08-02
  • 打赏
  • 举报
回复
谢谢思归,都是我粗心,唉,事实上您的:
before your class, try to add

[DefaultProperty("Items"),ParseChildren(true, "Items")]
public class YourClassHere

已经解决了我的问题,可能是对着代码看的时间长了,就什么也没有看出来,在我的class定义的最一个attribute就是ParseChildren(false),赫赫,这样定义能不出重复么,唉。
好了,现在问题解决了。

非常感谢!
saucer 2004-08-02
  • 打赏
  • 举报
回复
then try to override AddParsedSubObject, see the Overriding Control Parsing part in

http://samples.gotdotnet.com/quickstart/aspplus/doc/webctrlauthoring.aspx#innercontent
wintle 2004-08-02
  • 打赏
  • 举报
回复
好,谢谢,不过现在一个很尴尬的问题是,我写的这个组件是继承IE WebControls 的TreeView的,在TreeView的类定义里设置了ParseChildren(false),现在再定义ParseChildren(true, "Items"),就重复了,不知道怎么办?
唉-_-'.
saucer 2004-08-02
  • 打赏
  • 举报
回复
before your class, try to add

[DefaultProperty("Items"),ParseChildren(true, "Items")]
public class YourClassHere
wintle 2004-08-02
  • 打赏
  • 举报
回复
再UP..

这个问题要解决啊...我已经头痛好久了。

大侠出手啊~~
saucer 2004-08-02
  • 打赏
  • 举报
回复

GotDotNet User Sample: DropDownListPlaceholderControl
http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=0516b9af-879f-425e-bfc8-e8feb9a1fbeb
saucer 2004-08-02
  • 打赏
  • 举报
回复
try something like



private ListItemCollection _AllowedValues;

[
Browsable(true),
Description("DropDown Selection"),
DefaultValue(null),
Category("DropDown"),
MergableProperty(false),
PersistenceMode(PersistenceMode.InnerDefaultProperty),
Editor(typeof(System.Web.UI.Design.WebControls.ListItemsCollectionEditor), typeof(UITypeEditor)),
]
public virtual ListItemCollection AllowedValues
{
get
{
if (_AllowedValues == null)
{
_AllowedValues = new ListItemCollection();
}
return _AllowedValues;
}
}
ofei 2004-08-02
  • 打赏
  • 举报
回复
just a mistake

实现你所说的功能好象有三种方法:
1 类型转换器
2 UI编辑器
3 使用设计器

不过我手上只有1的实现 没有2 3 方法的实现

思路:从ComponentModel.TypeConverter派生类 重写如下方法
CanConvertFrom()
COnvertFrom()
CanConvertTo()
ConvertTo()
在这些方法种提供自己的实现和异常处理,再调用相应的基类的方法

再在应用的类上添加[TypeCoverter(typeof(实现TypeConverter类的类名))]

可参考<visual c#基于组件的开发> P338
wintle 2004-08-02
  • 打赏
  • 举报
回复
up一下,思归等大侠再帮看看啊。

3ks:)
wintle 2004-08-02
  • 打赏
  • 举报
回复
谢谢思归大侠!问题基本解决,现在在设计时可以编辑了,但又出了一个问题,我改成不采用ArrayList,而是用了一个继承于CollectionBase的MyItemCollection,做为Items的类型,即如:
[
Browsable(true),
DefaultValue(null),
DescriptionAttribute("子项Items"),
MergableProperty(false),
PersistenceMode(PersistenceMode.InnerDefaultProperty),
Editor(typeof(System.Web.UI.Design.WebControls.ListItemsCollectionEditor), typeof(UITypeEditor))
]
public MyItemCollection Items
{
get
{
if(this.items == null)
{
items = new MyItemCollection();
}
return items;
}
set
{
items = value;
}
}

在aspx的源文件中可以产生如:
<cc1:MyControl ....>
<cc1:MyItem Name="m" Target="mm" />
<cc1:MyItem Name="g" Target="gg" />
</cc1:MyControl>
的数据了,但在执行的时候,出错:Invalid child with tagname "cc1:MyItem"
由于MyItem是直接定义的一个数据结构类,为
public class MyItem
{
private string m_name;
private string m_target;
public string Name
{
get {return m_name;}
set { m_name = value;}
}
public string Target
{
get {return m_target;}
set { m_target = value;}
}
}
是否需要对这个类有所设定,还是如何操作,才能使用<cc1:MyItem>成为合法的子项?
chnj1981 2004-08-01
  • 打赏
  • 举报
回复
up
wintle 2004-08-01
  • 打赏
  • 举报
回复
Browsable(true)只能限制在属性编辑器里可见,不能定义是用什么来编辑吧。不过还是谢谢!

ofei 2004-08-01
  • 打赏
  • 举报
回复
添加 Browsable(true)
wintle 2004-08-01
  • 打赏
  • 举报
回复
有没有人知道啊...
wintle 2004-08-01
  • 打赏
  • 举报
回复
自己顶一下,高手快下手啊!!!

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧