繁体   English   中英

如何添加集合,例如动态数组作为自定义asp.net控件的属性?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM