繁体   English   中英

为嵌套控件创建自定义集合

[英]Create custom collection for nested controls

我正在尝试创建一个控件,但我被困在我以前做过很多次的事情上,我找不到它现在不起作用的原因。 所以我在寻求帮助。

我总是用 javascript 和 css 自己创建自定义导航菜单,效果很好。 但是我想如果我尝试为它制作一个基本的 class 控件,那么我将不需要再添加所有 javascript 并且控件只为我做,所以我正在设置一些基础知识,但由于某种原因我不能获取集合以获取我的项目中的嵌套控件。

我有3节课。

[ParseChildren(true)]
    [PersistChildren(false)]
    public class ScriptMenu : Control
    {
        private ScriptMenuItem _rootItem;

        [PersistenceMode(PersistenceMode.InnerProperty)]
        public ScriptMenuItemCollection Items
        {
            get
            {
                if (_rootItem == null)
                    _rootItem = new ScriptMenuItem();

                return _rootItem.Items;
            }
        }
    }

这只是基本的 ScriptMenu,稍后我将其设为脚本控件,但现在这是基本的 class。

public class ScriptMenuItem
    {
        private ScriptMenuItemCollection _items;

        public ScriptMenuItem()
        {
            _items = new ScriptMenuItemCollection();
        }

        [PersistenceMode(PersistenceMode.InnerProperty)]
        public ScriptMenuItemCollection Items => _items;
    }

这是应该为导航按钮添加的项目

public class ScriptMenuItemCollection : IList<ScriptMenuItem>, ICollection<ScriptMenuItem>
{
    private List<ScriptMenuItem> _list;

    public ScriptMenuItemCollection()
    {
        _list = new List<ScriptMenuItem>();
    }

    public ScriptMenuItem this[int index] { get => _list[index]; set => _list[index] = value; }

    public int Count => _list.Count;

    public bool IsReadOnly => false;

    public void Add(ScriptMenuItem item)
    {
        _list.Add(item);
    }

    public void Clear()
    {
        _list.Clear();
    }

    public bool Contains(ScriptMenuItem item) => _list.Contains(item);

    public void CopyTo(ScriptMenuItem[] array, int arrayIndex)
    {
        _list.CopyTo(array, arrayIndex);
    }

    public IEnumerator<ScriptMenuItem> GetEnumerator() => _list.GetEnumerator();

    public int IndexOf(ScriptMenuItem item) => _list.IndexOf(item);

    public void Insert(int index, ScriptMenuItem item)
    {
        _list.Insert(index, item);
    }

    public bool Remove(ScriptMenuItem item) => _list.Remove(item);

    public void RemoveAt(int index)
    {
        _list.RemoveAt(index);
    }

    IEnumerator IEnumerable.GetEnumerator() => _list.GetEnumerator();
}

现在这是一个自定义集合。 我需要一个自定义集合,因为我需要能够在底层项目之间传递一些参数并到达父项目,但这是我的问题开始的地方。

在 HTML 我得到

<custom:ScriptMenu runat="server" ID="ScriptMenu">
       <Items />
 </custom:ScriptMenu>

出于某种原因,项目标签总是关闭,如果我让它自动打开,那么他将无法识别我的 ScriptMenuItem。 我知道错误出在某个地方是我的自定义集合,但我看不出我做错了什么。 我已经从互联网上得到了大量的例子,但似乎没有一个对我有用。

我真的希望有人可以向我展示这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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