![](/img/trans.png)
[英]How do I create a custom attribute which is affected by runtime variables? (e.g. PrincipalPermissionAttribute)
[英]How do I add a collection e.g. dynamic array as a property of a custom asp.net control?
我正在尝试将动态可扩展属性添加到复合控件中,我可以将其放在设计器表面上。 我用String Array,List和ArrayList尝试过这个。 都有类似的结果。 我错过了什么,我不知道是什么。 以下是我认为的相关代码:
[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>标签上的验证错误告诉我“元素”系统。字符串'不受支持。然后,如果我尝试在浏览器中查看带有控件的页面(在设计窗口中编辑导致上面标记的属性之后),我会在带有开始标记的行上收到以下错误控制:
“数组创建必须具有数组大小或数组初始值设定项”
当我尝试在设计器的属性窗口中编辑属性时,我只收到此错误。 我可以在构造函数中使用值填充属性,并且带有控件的页面将在浏览器中加载并正常工作,并且值在设计图面的属性窗口中显示正常,我可以在整个控件中使用值,但是我无法在属性窗口中编辑它们。 如果我尝试添加一个,我会得到与上述相同的症状。
我觉得我可能只是缺少某种属性或声明或其他东西。 请帮忙?
您可以使用Collection<string>
而不是string[]
尝试类似的东西:
用法:
<cc:SomeClass >
<CustomLavel key="" value="" />
<CustomLavel key="" value="" />
<CustomLavel key="" value="" />
</cc:SomeClass>
public class SomeClass: Control, INamingContainer
{
private Collection<CustomLabel> _customLabelList;
protected override void AddParsedSubObject(object obj)
{
base.AddParsedSubObject(obj);
if (obj is CustomLabel)
{
_customLabelList.Add((CustomLabel)obj);
return;
}
}
[Category("Behavior")]
[Description("The fields collection")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[PersistenceMode(PersistenceMode.InnerDefaultProperty)]
[DefaultValue(null), MergableProperty(false), Bindable(false)]
public Collection<CustomLabel> CustomLabelList
{
get
{
return _customLabelList;
}
}
}
[TypeConverter(typeof(ExpandableObjectConverter))]
public class CustomLabel
{
private string _key;
private string _value;
public CustomLabel()
: this(string.Empty, string.Empty)
{
}
public CustomLabel(string key, string value)
{
_key = key;
_value = value;
}
[Category("Behavior")]
[DefaultValue("")]
[Description("Key")]
[NotifyParentProperty(true)]
public string Key
{
get
{
return _key;
}
set
{
_key = value;
}
}
[Category("Behavior")]
[DefaultValue("")]
[Description("Value")]
[NotifyParentProperty(true)]
public string Value
{
get
{
return _value;
}
set
{
_value = value;
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.