2010-02-23 44 views
1

我正在編寫自定義複合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); 
    } 

} 
+0

你解決了嗎?我正在爲內部子控件創建一個具有相同樣式屬性的複合控件。希望你能分享你的代碼。 – ajakblackgoat 2013-04-15 15:28:49

回答

1

你沒有設置。不幸的是,你不能直接設置this.myChildPanel.ControlStyle,因爲它是一個只讀屬性,所以你必須設置它的屬性。您ChildPanelStyle屬性更改爲以下:

[ 
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; 
    } 
    set 
    { 
     EnsureChildControls(); 
     this.myChildPanel.ControlStyle.BackColor = value.BackColor; 
     this.myChildPanel.ControlStyle.BorderColor = value.BorderColor; 
     this.myChildPanel.ControlStyle.BorderStyle = value.BorderStyle; 
     this.myChildPanel.ControlStyle.BorderWidth = value.BorderWidth; 
     this.myChildPanel.ControlStyle.CssClass = value.CssClass; 
     this.myChildPanel.ControlStyle.Font.Bold = value.Font.Bold; 
     this.myChildPanel.ControlStyle.Font.Italic = value.Font.Italic; 
     this.myChildPanel.ControlStyle.Font.Name = value.Font.Name; 
     this.myChildPanel.ControlStyle.Font.Names = value.Font.Names; 
     this.myChildPanel.ControlStyle.Font.Overline = value.Font.Overline; 
     this.myChildPanel.ControlStyle.Font.Size = value.Font.Size; 
     this.myChildPanel.ControlStyle.Font.Strikeout = value.Font.Strikeout; 
     this.myChildPanel.ControlStyle.Font.Underline = value.Font.Underline; 
     this.myChildPanel.ControlStyle.ForeColor = value.ForeColor; 
     this.myChildPanel.ControlStyle.Height = value.Height; 
     this.myChildPanel.ControlStyle.Width = value.Width; 
    } 
} 
+0

我嘗試添加一個setter,並沒有什麼區別 - 這是我的預期。我更新了我的示例,以顯示一個案例,其中由該屬性直接管理的樣式在設計器中正常工作,沒有設置器。 – Joe 2010-02-23 19:25:12

+0

順便說一下,setter使用類似myChildPanel.ControlStyle.Reset()的方式來更新ControlStyl是不可能的。 myChildPanel.ControlStyle.MergeWith(value); – Joe 2010-02-23 19:25:37

0

如果您從System.Web.UI.Control(其中根據simptoms最有可能是真實的)衍生的控制,你應該添加以下屬性得到你想要的東西:

[ParseChildren(true)] 
[PersistChildren(false)] 
public class MyControl : CompositeControl 
{ 
    ... 
} 

當從WebControl派生時,這並不是必須的。


PS 你不需要爲...樣式屬性二傳手 - 但要保證這些風格是真正在第一次嘗試,讓他們創建的。

相關問題