2013-01-22 56 views
0

我有幾個自定義用戶控件(100+),它們都具有相同的格式,這基本上要求我們將用戶控件包裝在目標頁面上的面板控件中。爲了簡單起見,我想創建一個基本控件來處理這個問題,因爲幾乎所有的基本功能對於每個自定義控件都是相同的。UserControl在asp.net中表現得像一個面板

我做了什麼來完成這個任務是創建一個基類,在該基類內創建一個私人面板控件,然後我重寫Render以在base.Render周圍生成面板前/後標籤。

現在,這項工作非常好,因爲我們關心的所有用戶控件都繼承了這一點,並且我們公開的少量格式化項目(繼承控件按預期方式工作)(Width,CssClass等)。

我真正想要的是通過基類將所有面板控件項目公開到繼承控件,但不必正確顯示每個元素的屬性/方法。

關於最佳方法是什麼的任何想法?我只是不想手動實現每個面板屬性/方法。我們也使用設計時間屬性(第一個是CssClass和寬度),但我們一直在參加設計時間屬性的用戶...

我們有什麼作品,只是尋找更簡單/更好的解決方案。

using System; 
using System.Collections; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

public class BaseUserControl : System.Web.UI.UserControl 
{ 
    private Panel _panel; 
    private bool _isPanelLoaded; 

    public Panel Panel 
    { 
     get 
     { 
      if (_panel == null) 
      { 
       _panel = new Panel(); 
       _isPanelLoaded = true; 
      } 
      return _panel; 
     } 
    } 

    public BaseUserControl() 
    { 

    } 

    protected override void Render(HtmlTextWriter writer) 
    { 
     if (_isPanelLoaded) 
     { 
      Panel.RenderBeginTag(writer); 
      base.Render(writer); 
      Panel.RenderEndTag(writer); 
     } 
     else 
     { 
      base.Render(writer); 
     } 
    } 

    public Unit Width 
    { 
     get 
     { 
      if (Panel.Width.IsEmpty) 
      { 
       return 0; 
      } 
      return Panel.Width; 
     } 
     set 
     { 
      Panel.Width = value; 
     } 
    } 

    public string CssClass 
    { 
     get 
     { 
      return Panel.CssClass; 
     } 
     set 
     { 
      Panel.CssClass = value; 
     } 
    } 
} 
+0

你不能直接通過Panel屬性訪問它們嗎?或者你是否想要在aspx頁面中配置這些選項? –

+0

你不能從Panel UserControl繼承嗎? –

回答

0

爲了公開所有的屬性,你必須繼承Panel控件。既然你有一個面板屬性,你可以在該屬性上設置屬性。要在標記中定義它們是對大多數簡單對象的挑戰......如果您給屬性<PersistenceMode(PersistenceMode.Attribute)>的屬性,您將能夠訪問Panel-CssClass的sytnax屬性,但我不知道這是否可行對你來說,因爲Panel是一個控件。很好嘗試。

你基本上是在談論如何編寫屬性來包裝你想要的屬性,所以如果前一種解決方案不起作用,最好是這樣做。

+0

只需重新包裝屬性是最快的解決方案。花了一點時間,但我編寫了所有的方法/屬性來訪問內部面板。 –

相關問題