我在.aspx代码隐藏之外的自定义类中创建了一个动态按钮。自定义类创建一个Table对象,并在该表中生成一列按钮。生成后,将表加载到占位符控件中。除了这个问题,一切都运作良好:
如何在自定义类中以编程方式为按钮对象分配“Click”事件?
MyButton.Click += new EventHandler(MyButtonClick);
这导致:'名称'MyButtonClick'在当前上下文中不存在'错误。
我知道它在当前上下文中不存在,但是一旦渲染了aspx页面,代码隐藏将包含一个处理'MyButtonClick'的方法。我不知道如何将Click事件方法名称存储到自定义类的Button对象中,并将其传递给要呈现的aspx代码隐藏。
答案 0 :(得分:4)
您必须在自定义控件中定义一个事件。点击按钮时触发该事件,以便.aspx可以处理它。
编辑:相同的原则适用于自定义类。
控制代码 - 背后:
public delegate void ButtonEventHandler();
public event ButtonEventHandler ButtonEvent;
protected void Button1_Click(object sender, EventArgs e)
{
ButtonEvent();
}
.ASPX代码背后:
protected override void OnInit(System.EventArgs e)
{
control1.ButtonEvent+=
new Control1.ButtonEventHandler (whatever_ButtonEvent);
}
protected void whatever_ButtonEvent()
{
//do something
}
答案 1 :(得分:1)
让我们采用这个概念并将其应用于具有文本框和两个按钮的用户控件。用户控件放在Gridview中。当我的代码运行时,我的事件处理程序方法中的方法始终为null。我认为必须做的事情是一个按钮位于gridview中的用户控件中。
这是我的用户控制代码。
public partial class User_Controls_GridViewFilter:System.Web.UI.UserControl {
public event EventHandler UserControlButtonClicked;
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
renderPage();
}
}
private void OnUserControlButtonClick()
{
if (UserControlButtonClicked != null)
{
UserControlButtonClicked();
}
}
protected void btnSearch_Click(object sender, EventArgs e)
{
OnUserControlButtonClick();
}
protected void btnReset_Click(object sender, EventArgs e)
{
OnUserControlButtonClick();
}
}
我在aspx页面上注册了控件。
((User_Controls_GridViewFilter)gvMapLayer.HeaderRow.FindControl("FilterBox1")).UserControlButtonClicked
+= new ButtonEventHandler(User_Controls_GridViewFilter_UserControlButtonClicked);