ASP.Net Контейнер Контроллер Дизайнер - PullRequest
1 голос
/ 19 ноября 2010

Я даю ... после нескольких дней, пытаясь выяснить, чего мне не хватает, я сдаюсь.Я не могу понять, как заставить мой простой элемент управления контейнером правильно отображаться в конструкторе.Вот основная разметка пользовательского элемента управления:

<div>
    <div>Title</div>
    <div>
        <!-- ASP.Net child controls -->
    </div>
</div>

Вот как это выглядит во время выполнения (заголовок, а затем дочерний элемент управления - GridView):

alt text

Вот простой код для базового элемента управления контейнером:

namespace Shoe.Controls
{
    //[Designer(typeof(ApplicationWindowDesigner))]
    //[ParseChildren(false)]
    //[PersistChildren(true)]
    [ToolboxData("<{0}:ApplicationWindow runat=\"server\"></{0}:ApplicationWindow>")]
    public class ApplicationWindow : System.Web.UI.WebControls.Panel
    {
        #region Designer Properties
        [Category("Appearance")]
        [DefaultValue("Application")]
        [Description("Title that will appear at the top of the Window.")]
        [Browsable(true)]
        /*
        public string Title
        {
            get{return (ViewState["ApplicationWindowTitle"] == null)? 
                string.Empty : 
                (string)ViewState["ApplicationWindowTitle"];}

            set{ViewState["ApplicationWindowTitle"] = value;}
        }
        */
        public string Title {get; set;}

        #endregion
        #region Rending Methods

        /*
        protected override void Render(HtmlTextWriter writer)
        {
            this.EnsureChildControls();

            writer.Write("<div class=\""+CssClass+"\" style=\"width: "+Width+"; height: "+Height+";\"><div>"+Title+"</div><div>");
            RenderChildren(writer);
            writer.Write("</div></div>");
        }
        */

        public override void RenderBeginTag(HtmlTextWriter writer)
        {
            writer.Write("<div class=\""+CssClass+"\" style=\"width: "+Width+"; height: "+Height+";\"><div>"+Title+"</div><div>");
            //base.RenderBeginTag(writer);
        }

        public override void RenderEndTag(HtmlTextWriter writer)
        {
            //base.RenderEndTag(writer);
            writer.Write("</div></div>");
        }
        #endregion
    }
}

Как вы видите код выше, в настоящее время он основан на элементе управления Panel.Однако я также попытался использовать WebControl в качестве базового класса, а затем предоставить свой собственный конструктор следующим образом:

namespace Shoe.Controls
{
    public class ApplicationWindowDesigner : ContainerControlDesigner
    //public class ApplicationWindowDesigner : ControlDesigner
    {
        /*
        public override void Initialize(IComponent component)
        {
            base.Initialize(component);

            SetViewFlags(ViewFlags.DesignTimeHtmlRequiresLoadComplete, true);
        }

        public override string GetDesignTimeHtml()
        {
            //return base.GetDesignTimeHtml();

            StringBuilder   sb  = new StringBuilder();
            TextWriter      s   = new StringWriter(sb);
            HtmlTextWriter  h   = new HtmlTextWriter(s);

            ApplicationWindow app_wnd = (ApplicationWindow)this.Component;

            app_wnd.RenderControl(h);

            h.Dispose();
            s.Dispose();

            return sb.ToString();
        }
        */
        /*
        public override string GetDesignTimeHtml(DesignerRegionCollection regions)
        {
            //return base.GetDesignTimeHtml(regions);
            ApplicationWindow app_wnd = (ApplicationWindow)this.Component;

            /
            return GetDesignTimeHtml();
        }
        */
    }
}

Как вы можете видеть, я попытался использовать ControlDesigner в качестве базового класса и ContainerControlDesigner в качествеБазовый класс.Когда я использую ControlDesigner, я заставляю дизайнера правильно отображать мою строку заголовка и элементы div;однако он не отображает дочерние элементы управления (GridView).Если я использую ContainerControlDesigner, он отображает дочерние элементы управления, но не строку заголовка и элементы div.Я не могу понять волшебную комбинацию, которая даст мне конструктор, который визуализирует мою окружающую рамку и дочерние элементы управления.

Вот как это выглядит в конструкторе при использовании Panel в качестве базового класса для элемента управления,нет дизайнера и подход начального / конечного тега:

alt text

Это также выглядит, когда я использую WebControl в качестве базового класса для элемента управления и использую конструктор на основеof ContainerControlDesigner (дочерний элемент управления, но моя строка заголовка и элементы div отсутствуют).

Чего мне не хватает?Я нашел несколько примеров ContainerControlDesigner, но ни один из них не добавляет ничего к окружающему элементу управления, как я.

1 Ответ

2 голосов
/ 19 ноября 2010

Вы на правильном пути ... Я делаю аналогичные вещи для создания закругленных панелей. Это значительно облегчает задачу, просто вставив панель и позволяя рендерингу создавать окружающие элементы. Я могу добавить дочерние элементы управления, и они отображаются правильно. Просто оборачиваем базовые методы рендеринга.

Веб-контроль (рабочий пример)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.Design.WebControls;
using System.ComponentModel;
using System.ComponentModel.Design;

namespace MyExample
{
    [DefaultProperty("Text")]
    [ToolboxData("<{0}:myPanel runat=server></{0}:bPanel>")]
    [Designer(typeof(MyPanelDesigner))]
    public class MyPanel : Panel
    {
        #region Property


        private string _Title = "No Title Set";
        public string Title
        {
            get { return _Title; }
            set { _Title = value; }
        }

        #endregion

        protected override void RenderChildren(HtmlTextWriter writer)
        {

            writer.Write(String.Format("<div><div>{0}</div></div>", this.Title));
            base.RenderChildren(writer);
            writer.Write("</div></div>");
        }

    }


    public class MyPanelDesigner : PanelContainerDesigner
    {
        public override string GetDesignTimeHtml(System.Web.UI.Design.DesignerRegionCollection regions)
        {
            // Read Property off control
            MyPanel c = (MyPanel)Component;
            string sTitle = c.Title;

            // Render design markup
            StringBuilder sb = new StringBuilder();
            sb.AppendFormat("<div><div>{0}</div></div>", sTitle);
            sb.Append(base.GetDesignTimeHtml(regions));
            sb.AppendFormat("</div></div>");
            return sb.ToString();
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...