2012-07-12 137 views
1

我在學習如何爲asp.net製作服務器控件。我使用第三方服務器控件的DevExpress。我試圖添加一個DevExpress按鈕到我的服務器控件。服務器控件中的服務器控件ASP.NET

public class Class1 : CompositeControl 
{ 
    private DevExpress.Web.ASPxEditors.ASPxButton btnTest; 

    protected override void Render(HtmlTextWriter writer) 
    {    
     btnTest.RenderControl(writer); 
    } 

    protected override void CreateChildControls() 
    { 
     btnTest = new DevExpress.Web.ASPxEditors.ASPxButton(); 
     btnTest.Text = "wazzzup"; 
     Controls.Add(btnTest); 
    } 
} 

出於某種原因,在設計視圖按鈕不會顯示出來,除非有相同的頁面作爲我的服務器控件上的另一個DevExpress的控制。任何想法如何解決這個問題?

+0

嘗試在'btnTest.RenderControl(writer);'之後添加'base.Render(writer);'。 – Candide 2012-07-12 17:19:16

+0

如果在標記中使用,則只需要使用[@Register]註冊控件,但不能在自定義控件中使用。它應該在控制範圍內工作...嘗試@Ingenu的建議,看看它是否有所作爲... – 2012-07-12 17:23:46

+0

其實我錯了,它會使用btnTest.RenderControl(writer)註冊devexpress控件;唯一的問題是它不會出現在設計視圖中,除非在同一頁面上有另一個devexpress控件。 (我修改了我的問題) – 2012-07-12 20:43:45

回答

0

由於您從CompositeControl繼承,您不應該重寫Render。

+0

http://msdn.microsoft.com/en-us/library/3257x3ea.aspx 微軟在這個例子中是這樣做的,你是否需要重寫Render()函數來輸出控制? – 2012-07-13 14:39:23

+1

@rickster:不,CompositeControls的正常行爲是,它將默認呈現您在CreateChildControls方法內部構建的任何控件樹。 (我沒有看到MSDN示例的任何好理由,通過重寫渲染使事情複雜化,因爲他們所做的事情也可以在CreateChildControls中完成,尤其是因爲他們不打算解釋爲什麼他們這樣做。 ..) – 2012-07-13 20:57:00