【发布时间】:2011-05-12 17:57:31
【问题描述】:
我放弃了……在试图弄清楚我错过了什么之后,我放弃了。我无法弄清楚如何让我的简单容器控件正确显示在设计器中。下面是自定义控件的基本标记:
<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
}
}
正如您在上面看到的代码,它目前基于面板控件。但是,我也尝试使用 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 的例子,但没有一个像我这样真正为周围的控件添加任何东西。
【问题讨论】:
-
我故意将注释掉的代码留在原处,以展示我尝试过的一些不同的东西。
标签: asp.net custom-controls containers designer design-time