首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未在保管子控件上激发RaisePostBackEvent

问未在保管子控件上激发RaisePostBackEvent
EN

Stack Overflow用户
提问于 2016-08-04 17:44:10
回答 1查看 48关注 0票数 0

我在我的C#代码中创建了两个自定义控件来使用bootstrap。第一个用下面的代码实现一个bootstrap下拉列表;

代码语言:javascript
复制
using System.Web.UI;
using System.Web.UI.WebControls;
using static JDBootStrap.BSTypes;

namespace JDBootStrap.Components
{
    [ToolboxData("<{0}:BSDropDown runat=server></{0}:BSDropDown>")]
    public class BSDropDown : Panel
    {
        public enum OrientationType { Down, Up, Right }

        string _text;
    OrientationType _orientation;
    ControlCollection _controls;
    sizeType _size = sizeType.md;
    bool _useInGroup;
    bool useInList;
    Glyphicon.GlyphiconType? _glyphicon;
    string _style;

    public BSDropDown()
    {
        Controls = new ControlCollection(this);
    }

    public Glyphicon.GlyphiconType? Glyphicon
    {
        get
        {
            return _glyphicon;
        }

        set
        {
            _glyphicon = value;
        }
    }

    #region Properties

    protected override string TagName
    {
        get
        {
            return UseInList ? "li" : "div";
        }
    }

    protected override ControlCollection CreateControlCollection()
    {
        return Controls;
    }

    public string Text
    {
        get
        {
            return _text;
        }

        set
        {
            _text = value;
        }
    }

    public OrientationType Orientation
    {
        get
        {
            return _orientation;
        }

        set
        {
            _orientation = value;
        }
    }

    public bool UseInList
    {
        get
        {
            return useInList;
        }

        set
        {
            useInList = value;
        }
    }

    new public ControlCollection Controls
    {
        get
        {
            return _controls;
        }

        set
        {
            _controls = value;
        }
    }

    public sizeType Size
    {
        get
        {
            return _size;
        }

        set
        {
            _size = value;
        }
    }

    public bool UseInGroup
    {
        get
        {
            return _useInGroup;
        }

        set
        {
            _useInGroup = value;
        }
    }

    #endregion

    public override void RenderBeginTag(HtmlTextWriter writer)
    {
        writer.Write("<" + TagName + " class=\"" + GetOrientationClass());
        if (_orientation == OrientationType.Right) writer.Write(" dropdown-submenu");
        if (!string.IsNullOrEmpty(CssClass)) writer.Write(" " + CssClass);

        if (_useInGroup) writer.Write(" btn-group");
        writer.Write(" btn-" + (UseInGroup ? "group-" : "") + _size.ToString().ToLower());
        writer.Write("\"");
        writer.Write(" name =\"" + UniqueID + "\"");
        writer.Write(" id=\"" + ClientID + "\"");
        writer.Write(">");

        writer.Write(UseInList ? "<a href =\"#\"" : "<button");
        writer.Write(" class=\"");
        writer.Write(_useInGroup ? "btn btn-default " : "");
        writer.Write("dropdown-toggle");
        writer.Write("\" data-toggle=\"dropdown\" role=\"button\" aria-haspopup=\"true\" aria-expanded=\"false\">");
        if (!string.IsNullOrEmpty(_text)) writer.WriteEncodedText(_text);
        if (_glyphicon != null)
        {
            var g = new Glyphicon((Glyphicon.GlyphiconType)_glyphicon);
            g.RenderControl(writer);
        }
        if (_orientation != OrientationType.Right) writer.Write("<span class=\"caret\" style=\"margin-left:4px;\"></span>");
        writer.Write(UseInList ? "</a>" : "</button>");

        writer.Write("<ul class=\"dropdown-menu\">");
    }

    protected override void Render(HtmlTextWriter writer)
    {
        RenderBeginTag(writer);
        RenderChildren(writer);
        RenderEndTag(writer);
    }
    protected override void RenderChildren(HtmlTextWriter writer)
    {
        foreach (Control ctrl in Controls)
        {
            if (ctrl.GetType() == typeof(BSDropDown)) ((BSDropDown)ctrl).Orientation = OrientationType.Right;
            if (ctrl.GetType() == typeof(BSMenuItem)) ((BSMenuItem)ctrl).SubMenu = true;
            ctrl.RenderControl(writer);
        }
    }

    public override void RenderEndTag(HtmlTextWriter writer)
    {
        writer.Write("</ul>");
        writer.Write("</" + TagName + ">");
    }

    private string GetOrientationClass()
    {
        switch (Orientation)
        {
            case OrientationType.Up:
                return "dropup";
            default:
                return "dropdown";
        }
    }
}

}

第二个是如下所示的菜单项:

代码语言:javascript
复制
using System;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace JDBootStrap.Components
{
    [ToolboxData("<{0}:BSMenuSeparator runat=server></{0}:BSMenuSeparator>")]
    public class BSMenuSeparator : WebControl
    {
        protected override void Render(HtmlTextWriter writer)
        {
            writer.Write("<li class=\"divider\"></li>");
        }
    }
    [ToolboxData("<{0}:BSMenuHeader runat=server></{0}:BSMenuHeader>")]
    public class BSMenuHeader : WebControl
    {
        private string _title;

        public BSMenuHeader(string title)
        {
            _title = title;
        }

        public string Title
        {
            get
            {
                return _title;
            }

            set
            {
                _title = value;
            }
        }

        protected override void Render(HtmlTextWriter writer)
        {
            writer.Write("<li class=\"dropdown-header\">");
            if (!string.IsNullOrEmpty(_title)) writer.Write(_title);
            writer.Write("</li>");
        }
    }
    [ToolboxData("<{0}:BSMenuItem runat=server></{0}:BSMenuItem>")]
    public class BSMenuItem : Panel, IButtonControl, IPostBackEventHandler
    {

        string _text;
        string _navigateUrl;
        bool _active ;
            b

ool _subItem;
        Glyphicon.GlyphiconType? _glyphicon;
        string _value;
        string _title;
        string _commandArgument;
        string _validationGroup;
        string _postBackUrl;
        string _commandName;
        bool _causesValidation;
        static readonly object EventClick = new object();

        public event EventHandler Click
        {
            add
            {
                Events.AddHandler(EventClick, value);
            }
            remove
            {
                Events.RemoveHandler(EventClick, value);
            }
        }

        public event CommandEventHandler Command;

        #region Property
        public BSMenuItem()
        {
        }

        public BSMenuItem(string text)
        {
            _text = text;
        }

        public BSMenuItem(string text, string navigateUrl)
        {
            _text = text;
            _navigateUrl = navigateUrl;
        }

        public string Text
        {
            get
            {
                return _text;
            }

            set
            {
                _text = value;
            }
        }

        public string NavigateUrl
        {
            get
            {
                return _navigateUrl;
            }

            set
            {
                _navigateUrl = value;
            }
        }

        public bool Active
        {
            get
            {
                return _active;
            }

            set
            {
                _active = value;
            }
        }

        public bool SubMenu
        {
            get
            {
                return _subItem;
            }

            set
            {
                _subItem = value;
            }
        }

        public Glyphicon.GlyphiconType? Glyphicon
        {
            get
            {
                return _glyphicon;
            }

            set
            {
                _glyphicon = value;
            }
        }

        public bool CausesValidation
        {
            get
            {
                return _causesValidation;
            }

            set
            {
                _causesValidation = value;
            }
        }

        public string CommandArgument
        {
            get
            {
                return _commandArgument;
            }

            set
            {
                _commandArgument = value;
            }
        }

        public string ValidationGroup
        {
            get
            {
                return _validationGroup;
            }

            set
            {
                _validationGroup = value;
            }
        }

        public string PostBackUrl
        {
            get
            {
                return _postBackUrl;
            }

            set
            {
                _postBackUrl = value;
            }
        }

        public string CommandName
        {
            get
            {
                return _commandName;
            }

            set
            {
                _commandName = value;
            }
        }

        public string Value
        {
            get
            {
                return _value;
            }

            set
            {
                _value = value;
            }
        }

        public string Title
        {
            get
            {
                return _title;
            }

            set
            {
                _title = value;
            }
        }
        #endregion


        protected override void Render(HtmlTextWriter writer)
        {
            if (Controls.Count == 0)
            {
                writer.Write("<li");
                writer.Write(" name =\"" + UniqueID + "\"");
                writer.Write(" id=\"" + ClientID+"\"");
                if (_active) writer.Write(" class=\"active\"");
                writer.Write("><a href=\"");
                writer.WriteEncodedUrl(NavigateUrl ?? "#");
                writer.Write("\"");
                if (Events != null) writer.Write(" OnClick=\"" + Page.ClientScript.GetPostBackEventReference(this, Value)+"\"");

                if (Title != null) writer.Write(" title=\"" + Title + "\"");
                writer.Write(">");

                if (Glyphicon!=null)
                {
                    var g = new Glyphicon((Glyphicon.GlyphiconType)_glyphicon);
                    g.RenderControl(writer);
                }
                if (!string.IsNullOrEmpty(_text)) writer.WriteEncodedText(_text);
                writer.Write("</a></li>");
            }
            else
            {
                var dd = new BSDropDown
                {
                    Text = _text,
                    UseInList = true                    
                };

                if (SubMenu) dd.Orientation = BSDropDown.OrientationType.Right;
                dd.Controls=Controls;


                dd.RenderControl(writer);

            }
        }

        protected virtual void OnClick(EventArgs e)
        {
            EventHandler handler = (EventHandler)Events[EventClick];
            handler?.Invoke(this, e);
        }
        protected virtual void OnCommand(CommandEventArgs e)
        {
            Command?.Invoke(this, e);
        }

        public void RaisePostBackEvent(string eventArgument)
        {
            OnClick(new EventArgs());
            OnCommand(new CommandEventArgs(CommandName, CommandArgument));
        }
    }

如果我单独使用菜单项,或者作为下拉式控件的子控件使用aspx页面来设置它们,它就能正常工作。但是如果我以编程方式创建它们,我的RaisePostBackEvent永远不会被触发。__EventTarget设置得很好,但什么也没发生。

只有当我在aspx页面中设置我下拉列表并以编程方式添加我的孩子时,它才能工作...(我在Page_init中添加我的控件)。谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-05 15:05:44

我使用控件数组覆盖下拉列表中的控件。如果我移除这个集合并使用继承的控件属性,它就可以工作。

我使用的是我自己的数组,因为我的菜单项可以改变行为,如果有孩子的话就会变成下拉列表。因此,我必须将控件子项从menuitem移动到下拉列表(不能设置列表和控件)。

现在我必须像这样移动控件:

代码语言:javascript
复制
int l = Controls.Count;
for (int a = 0; a < l; a++)
dd.Controls.Add(Controls[0]);
Controls.Clear();

Controls.Add(dd);

其中dd是我的新下拉列表。希望它能帮助到一些人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38763898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档