【发布时间】:2011-01-20 05:21:26
【问题描述】:
我正在编写一个自定义复合 WebControl,并希望将其封装的子控件样式公开给 ASP.NET 设计器。我目前拥有的代码类似于下面的骨架(为简单起见,它只有一个子控件)。
通过下面的代码,我可以在设计器中看到属性“ChildPanelStyle”,但是当我尝试在设计器中修改其中一个属性(例如 CssClass)时,它会立即将自身重置为其默认值。看起来设计器序列化没有发生。
我做错了什么?
更新
为 style 属性添加一个 setter 没有帮助,也不应该是必要的。我使用由自定义控件直接管理的附加样式属性更新了示例,而不是简单地作为子控件的属性。
HeaderStyle 属性由设计器正确保留,但 ChildPanelStyle 属性不是。
当然,我可以管理我的所有样式,如 HeaderStyle,并在渲染期间应用它们,但我希望有一个更简单的解决方案,子控件可以自行处理,我不需要任何自定义渲染。
public class MyControl : CompositeControl
{
Panel myChildPanel;
protected override void CreateChildControls()
{
myChildPanel = new Panel();
this.Controls.Add(myChildPanel);
}
[
Category("Style"),
Description("Child panel style"),
DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
NotifyParentProperty(true),
PersistenceMode(PersistenceMode.InnerProperty),
]
public System.Web.UI.WebControls.Style ChildPanelStyle
{
get
{
EnsureChildControls();
return this.myChildPanel.ControlStyle;
}
}
[
Category("Style"),
Description("Header style"),
DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
NotifyParentProperty(true),
PersistenceMode(PersistenceMode.InnerProperty),
]
public System.Web.UI.WebControls.Style HeaderStyle
{
get
{
if (_headerStyle == null)
{
_headerStyle = new Style();
if (IsTrackingViewState)
((IStateManager)_headerStyle).TrackViewState();
}
return _headerStyle;
}
}
private System.Web.UI.WebControls.Style _headerStyle;
// ... overrides for save/load/tracking ViewState omitted
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
EnsureChildControls();
base.Render(writer);
}
}
【问题讨论】:
-
你解决了吗?我正在为内部子控件创建一个具有相同样式属性的复合控件。希望你能分享你的代码。
标签: asp.net coding-style designer web-controls