Я даю ... после нескольких дней, пытаясь выяснить, чего мне не хватает, я сдаюсь.Я не могу понять, как заставить мой простой элемент управления контейнером правильно отображаться в конструкторе.Вот основная разметка пользовательского элемента управления:
<div>
<div>Title</div>
<div>
<!-- ASP.Net child controls -->
</div>
</div>
Вот как это выглядит во время выполнения (заголовок, а затем дочерний элемент управления - GridView):
Вот простой код для базового элемента управления контейнером:
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 в качестве базового класса для элемента управления,нет дизайнера и подход начального / конечного тега:
Это также выглядит, когда я использую WebControl в качестве базового класса для элемента управления и использую конструктор на основеof ContainerControlDesigner (дочерний элемент управления, но моя строка заголовка и элементы div отсутствуют).
Чего мне не хватает?Я нашел несколько примеров ContainerControlDesigner, но ни один из них не добавляет ничего к окружающему элементу управления, как я.