2010-10-08 45 views
3

我想添加一个动态可扩展的属性到一个复合控件,我可以放在设计器的表面上。我已经尝试过使用String Array,List和ArrayList。所有的结果都相似。我错过了一些东西,我不知道是什么。这里是我认为是相关的代码:如何添加一个集合,例如动态数组作为一个自定义的asp.net控件的属性?

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content), 
    NotifyParentProperty(true), 
    PersistenceMode(PersistenceMode.InnerProperty)] 
    public String[] AccessLevels 
    { 
     get 
     { 
      String[] s = (String[])ViewState["AccessLevels"]; 
      return s; 
     } 

     set 
     { 
      ViewState["AccessLevels"] = value; 
     } 
    } 

该控制编译罚款,我可以把它放在我的设计师表面。它在Visual Studio 2008的“属性”窗口中为我提供了一个属性,名为“+ AccessLevels”,值为“String [] Array”,旁边有一个省略号。如果我点击elipsis,它会打开一个编辑器,我可以一次插入一行属性。如果我单击“AccessLevels”属性旁边的小加号符号,它将显示我输入的属性,每个属性旁边都有一个数字,表示数组的索引。大!但是当我这样做时,无论我输入什么值作为属性,下面的HTML都是由设计者自动生成的。

<cc2:HBAdmin ID="HBAdmin1" runat="server"> 
     <AccessLevels> 
     <system.string></system.string> 
     <system.string></system.string> 
     <system.string></system.string> 
     </AccessLevels> 
    </cc2:HBAdmin> 

HBAdmin是我的控件的名称,cc2命名空间是正确的。问题是标签。那里应该有一个价值吗?我还为< AccessLevels>标记获取了intellisense,告诉我“内容不允许在元素'AccessLevels'的打开和关闭标记之间”,并且还在< system.string>标记上告诉我“元素”系统的验证错误。字符串'不支持。然后,如果我尝试在浏览器中查看带有控件的页面(在设计窗口中编辑导致上面标记的属性之后),我会看到带有开始标记的行上的以下错误控制:

“数组创建必须有数组大小或数组初始化”

我只当我尝试在设计师的属性窗口中编辑属性得到这个错误,我可以在值填充属性。构造函数和t他带有控件的页面将在浏览器中加载并正常工作,并且值在设计图面的属性窗口中显示正常,我可以在整个控件中使用这些值,但我无法在属性窗口中对其进行编辑。如果我尝试添加一个,则会出现与上述相同的症状。

我觉得我可能只是缺少某种属性或声明或东西。请帮忙?

回答

1

试着这么做:

用法:

​​3210
+0

我试图用这个代码,但我不明白的重写AddParsedSubObject方法。什么是_customLabelList,它在哪里定义?是“SomeClass”定义我的复合控件的类,还是它定义了保存我的数据的类型,还是仅用作示例,我会用我的Composite控件替换它? – Camenwolf 2010-10-08 16:02:02

+0

对不起customLabelList是一个私人领域,我会编辑答案。 SomeClass是你的控件,你将把它放在页面上。您会将我的代码替换为您的特定需求。这是我在其中一个网站上使用的示例。 – skyfoot 2010-10-08 16:09:50

+0

当我在设计器中为属性赋值时,他们似乎可以工作,但是当我离开设计师时,他们不在属性窗口中列出,并且它们不会持续。另外,我尝试在构造函数中添加一些默认值,如this.AddParsedSubObject(new CustomLabel(“thiskey”,“thatvalue”));那么当我放下设计器上的ctrl时,我会得到“对象引用未设置为和对象的实例”。所以我尝试实例化对象并分配它,然后在调用AddParsedSubObject时使用该实例。一样。 – Camenwolf 2010-10-08 17:01:50

4

您可以使用Collection<string>代替string[]

相关问题