我正在尝试为可放置在设计师面板上的复合控件添加动态可扩展属性。我已经尝试使用字符串数组、列表和数组列表来实现,但是都没有得到理想的结果。我感觉自己缺少了什么重要信息。以下是我认为相关的代码:
[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”,旁边有一个省略号[...]。如果我点击省略号,它会打开一个编辑器,让我逐行插入属性。如果我点击“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>标签的智能感知提示“元素'AccessLevels'的开放和闭合标记之间不允许内容”,以及<system.string>标签的验证错误,提示“不支持元素'System.String'”。然后,如果我尝试在浏览器中查看带有控件的页面(在编辑设计窗口中的属性导致上述标记),我会在控件的开放标记所在行上得到以下错误:
"数组创建必须具有数组大小或数组初始化程序"
只有当我尝试在设计器的属性窗口中编辑属性时才会出现此错误。我可以在构造函数中填充属性值,并且带有控件的页面将在浏览器中加载并正常工作,属性窗口中的值也显示正常,我可以在整个控件中使用这些值,但我无法在属性窗口中编辑它们。如果我尝试添加一个,我会得到与上述描述相同的症状。
我觉得我可能只是缺少某种属性或声明或其他东西。请帮忙解决?