尝试触发ASP.NET自定义控件按钮事件时出现问题

时间:2013-04-12 15:23:41

标签: asp.net

我有一个简单的asp.net测试自定义控件,我已经创建并试图弄清楚为什么click事件不会触发。下面是代码。我只是在Page_Load为.aspx页面的测试页面上创建一个控件实例,该页面使用了控制受保护的void Page_Load(object sender,EventArgs e){Page.Form.Controls.Add(new TestControl()); }

该页面会回发,但它不会在用户控件中选择click事件。请解释我做错了什么或者用特定模式等方法来解决这个问题。

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

namespace WorldOfTest
{
public class TestControl : WebControl { private Button btn;
protected override void OnInit(EventArgs e)
{            
    base.OnInit(e);
}

protected override void EnsureChildControls()
{
    btn = new Button();           
    this.Controls.Add(btn); 
    base.EnsureChildControls();
}

protected override void CreateChildControls()
{

    btn.Click += new EventHandler(btn_Click);  
    btn.Text = "test button";                         
    base.CreateChildControls();
}

void btn_Click(object sender, EventArgs e)
{
    throw new NotImplementedException();
}

protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
    btn.RenderControl(writer); ;
}

} }

2 个答案:

答案 0 :(得分:0)

将自定义控件添加到页面时,请使用LoadControl。

var control = (TestControl)LoadControl("~/path/to/TestControl.ascx");
Page.Form.Controls.Add(control);

答案 1 :(得分:0)

如果您的按钮位于控件集合中,则无需覆盖渲染并调用btn.Render。我也会添加它并订阅OnLoad事件。最后一件事,你需要实现INamingContainer。

protected override void OnLoad(EventArgs e)
{
   btn = new Button();
   btn.Click += new EventHandler(btn_Click);  
   btn.Text = "test button";
   this.Controls.Add(btn);
}