如何从实例化对象的页面处理对象上的按钮单击事件?

时间:2015-05-21 20:52:00

标签: c# asp.net .net visual-studio-2010 delegates

我在Visual Studio 2010和IIS6上的asp.net 3.5中工作。

更新:我已在此问题的最后添加了一个SSCCE,以证明我的问题。

我有一个我称之为DialogBox的类,它通过包装一个面板对象并将该面板添加到当前页面来在网站上创建一种AlertBox。面板上有一个OK按钮。所以我要做的是在页面上创建这个类的实例,让OK按钮的click事件由实例化该类的页面上的处理程序处理。在我看来,这应该有用......

在我的DialogBox类中,我有一些字段定义如此......

private EventHandler _OKClick;
private Button _buttonOK;

我也有一个像这样定义的公共财产......

public EventHandler OKClick
{
    set { _OKClick = value; }
}

面板控件有一个.show()方法,它可以获取所有组件并在使其可见之前将其全部构建。在这种方法中,我有这条线......

    _buttonOK.Click += _OKClick;

然后在我的页面上,我正在实例化课程的那个我有...

protected void Page_LoadComplete(object sender, EventArgs e)
{
    if(!IsPostBack)
    {
        DialogBox Alert = new DialogBox();
        Alert.OKClick = new EventHandler(Alert_OkClick);
        Alert.Show();
    }
}

我有像这样定义的实际处理程序......

void Alert_OkClick(object sender, EventArgs e)
{
    lblOutput.Text = "It Works!!!";
    lblOutput.Visible = true;
}

代码编译得很好。我单击按钮,对话框消失,就像我期望的那样,当页面回发时,它不会运行Alert_OkClick中的代码。

为了理解模型,我一直在阅读有关代表和事件的大量内容。我已成功在此DialogBox类上创建了一个事件,我可以从我的页面触发。但使用按钮是不同的,因为它已经定义了一个我正在尝试处理的事件。我只是想错误地思考这个问题吗?

感谢您的阅读。

这是SSCCE

这是一个包装面板对象以创建警告框的类......

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

public class AlertBox
{
    Panel _this = new Panel();
    Button _OKButton = new Button();
    Page page = (Page)HttpContext.Current.Handler;
    EventHandler _OkClick;

    public AlertBox()
    {
        _OKButton.Text = "OK";
        _this.BorderStyle = BorderStyle.Solid;
        _this.Controls.Add(new LiteralControl("<p>This is an ALERT!</p><p>Press OK</p>"));
        _this.Controls.Add(_OKButton);   
    }

    public EventHandler OkClick
    {
        get {return _OkClick;}
        set {_OkClick = value;}
    }


    public void Show()
    {
        _OKButton.Click += _OkClick;
        page.Form.Controls.Add(_this);
    }
}

这是实例化该类的页面背后的代码。这些页面只是一个空白的aspx页面......

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            AlertBox Alert = new AlertBox();
            Alert.OkClick = new EventHandler(AlertOk_Click);
            Alert.Show();
        }
    }

    protected void AlertOk_Click(Object sender, EventArgs e)
    {
        Response.Write("EVENT HAS BEEN HANDLED!");
    }
}

当按钮回发到页面时,为什么处理程序不会触发?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

问题应该在这里:

Alert.OKClick += new EventHandler(Alert_OkClick); instead.

应该是

addiu   d,s,const        # $d <—— s + const. 
                         # Const is 16-bit two's comp. sign-extended to 32 bits
                         # when the addition is done. No overflow trap.

基本上,您会注册一个方法,以便在发生事件时进行响应。您不会将其分配为变量。