我正在編寫自定義複合WebControl並希望將它封裝的子控件樣式公開給ASP.NET設計器。我現在的代碼與下面的框架類似(爲了簡單起見,只有一個子控件)。使用下面的代碼,我可以在設計器中看到屬性「ChildPanelStyle」,但是當我嘗試修改設計器中的某個屬性(例如CssClass)時,它會立即將其自身重置爲其默認值。它看起來像設計師序列化沒有發生。如何在自定義複合WebControl中公開子控件樣式屬性
我在做什麼錯?
UPDATE
添加樣式屬性並不能幫助一個二傳手,不應該是必要的。我已經使用由自定義控件直接管理的其他樣式屬性更新了示例,而不是簡單地作爲子控件的屬性。
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);
}
}
你解決了嗎?我正在爲內部子控件創建一個具有相同樣式屬性的複合控件。希望你能分享你的代碼。 – ajakblackgoat 2013-04-15 15:28:49