我正在使用Telerik ASP.Net Ajax控件(理论上无论是谁制作第三方控件都无关紧要)。我想创建自己的自定义服务器控件(不是用户控件),它具有我自己的预定义HTML输出,但也包括Telerik DatePicker。由于Telerik DatePicker是另一个服务器控件将服务器控件放入我的自定义服务器控件的正确过程。
我的理解是服务器控件通过编写html输出来工作。如何编写我在Render方法中实例化的另一个控件的输出,并仍然保留原始控件的单个生命周期。
期望的结果:
解决方案
感谢@Sumo将我指向了Composite控件的方向。文档可用here。
我能够通过创建一个继承CompositeDataBoundControl
的控件来解决问题。然后数据绑定我的数据源,计算所需的自定义控件数量,将它们放入ArrayList并正确实例化它们(在CreateChildControls()
中有自己的生命周期)。然后,我可以通过调用尚未呈现的ArrayList索引,在DatePicker
方法中的Render()
的ArrayList中呈现每个控件。
例如。 ((RadDatePicker)datePickerArray(instantiatedDatePickersCount)).RenderControl(writer)
。
目前它是一个肮脏的解决方案,但它适用于我的测试目的。
答案 0 :(得分:2)
您需要创建CompositeControl。这允许您使用CreateChildControls的覆盖轻松添加HTML标记和控件,而不必考虑太多其他内容。
一些示例代码:
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
namespace TestServerControls {
[DefaultProperty("Text")]
[ToolboxData("<{0}:GridWithHeader runat=server></{0}:GridWithHeader>")]
public class GridWithHeader : CompositeControl {
private readonly GridView _grid = new GridView();
private readonly HtmlGenericControl _header = new HtmlGenericControl("h1");
public string Text {
get { return _header.InnerHtml; }
set { _header.InnerHtml = value; }
}
protected override void CreateChildControls() {
Controls.Add(_header);
Controls.Add(_grid);
}
}
}
答案 1 :(得分:0)
您应该创建一个用户控件(ASCX文件),它可以包含其他嵌套控件和标记。