2012-07-12 140 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