标题不完全准确,我有一个带有PanelControlCollection
类型属性的Container控件,它基本上是PanelControl
的集合:
public class PanelControl : System.Web.UI.WebControls.Panel
{
public string Title { get; set; }
}
public class PanelControlCollection : Collection<PanelControl> {}
我的自定义用户控件:
public partial class FormSlideShow : BaseUserControl
{
[PersistenceMode(PersistenceMode.InnerProperty)]
public PanelControlCollection Panels Title { get; set; }
protected override void Render(HtmlTextWriter writer)
{
foreach(var panel in Panels)
{
ContentPlaceHolder.Controls.Add(
new LiteralControl("<fieldset class='step' Title='" + panel.Title + "'>"));
ContentPlaceHolder.Controls.Add(panel);
ContentPlaceHolder.Controls.Add(
new LiteralControl("</fieldset>"));
}
base.Render(writer);
}
}
我希望能够制作自定义控件并在标记中添加页面(Default.aspx中的代码):
<ctrl:FormSlide runat="server" ID="frmSlide">
<Panels>
<ctrl:PanelControl runat="server" ID="page1"><asp:Button runat="server" ID="btnTest" OnClick="btnTest_Onclick" /></ctrl:PanelControl>
<ctrl:PanelControl runat="server" ID="PanelControl1">Page 2</ctrl:PanelControl>
</Panels>
</ctrl:FormSlide>
我的问题是,如果我想在普通的aspx页面中托管控件,如何将我的Button控件(btnTest)连接到default.aspx后面的代码中的OnClick事件?如果我使用按钮放置一个普通的Panel控件,我可以将事件附加到onclick而不是我的自定义控件。
顺便说一下这是我在default.aspx上的代码,我想运行但不能运行的代码:
protected void btnTest_Onclick(object sender, EventArgs e)
{
Response.Redirect("http://www.google.com");
}
感谢。
答案 0 :(得分:2)
尝试移动它:
foreach(var panel in Panels)
{
ContentPlaceHolder.Controls.Add(
new LiteralControl("<fieldset class='step' Title='" + panel.Title + "'>"));
ContentPlaceHolder.Controls.Add(panel);
ContentPlaceHolder.Controls.Add(
new LiteralControl("</fieldset>"));
}
base.Render(writer);
进入OnInit
而不是Render
。我认为使用ASP.NET注册PostBack事件已经太晚了Render
。我能够重现你的问题,然后通过移动那段代码来解决它。
当然,base.Render(writer);
应替换为base.OnInit(e);