我给...几天后试图弄清楚我错过了什么,我放弃了。我无法弄清楚如何让我的简单容器控件正确显示在设计器中。这是自定义控件的基本标记:
<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 作为控件的基类、没有设计器和 Begin/End 标记方法时在设计器中的外观:
当我使用 WebControl 作为控件的基类并使用基于 ContainerControlDesigner 的设计器(子控件,但我的标题栏和 div 丢失)时,这也是它的样子。
我错过了什么?我找到了几个 ContainerControlDesigner 的例子,但没有一个像我一样真正向周围的控件添加任何东西。