C# 在网络控件中处理按钮单击事件

C# 在网络控件中处理按钮单击事件,c#,asp.net,button,event-handling,web-controls,C#,Asp.net,Button,Event Handling,Web Controls,我创建了一个自定义WebControl,它实现了一个简单的消息框,可以显示在网页顶部。类似于YouTube在页面上显示消息的方式。我的问题是将单击事件从我添加到框中的任何按钮传递到ASPX页面 下面是网络控制的代码。我想我已经正确地处理了点击事件,但是当我将这段代码添加到我的页面时,点击事件永远不会被调用,尽管页面加载会被调用 以下是APSX页面中的代码: <rt:ConfirmationBox ID="ConfirmationBox1" runat="server" BoxType="I

我创建了一个自定义WebControl,它实现了一个简单的消息框,可以显示在网页顶部。类似于YouTube在页面上显示消息的方式。我的问题是将单击事件从我添加到框中的任何按钮传递到ASPX页面

下面是网络控制的代码。我想我已经正确地处理了点击事件,但是当我将这段代码添加到我的页面时,点击事件永远不会被调用,尽管页面加载会被调用

以下是APSX页面中的代码:

<rt:ConfirmationBox ID="ConfirmationBox1" runat="server" BoxType="Info" BoxButtons="OkayCancel" OnOkayClicked="ConfirmationBoxOkayClicked"
    Text="Click OK to close." />
以下是网络控制代码:

public enum ConfirmationBoxType
{
    Hidden,
    Success,
    Warn,
    Error,
    Info
}

public enum ConfirmationBoxButtons
{
    None,
    Okay,
    Cancel,
    OkayCancel
}

[DefaultProperty("Text")]
[ToolboxData("<{0}:ConfirmationBox ID=\"ConfirmationBox1\" runat=server></{0}:ConfirmationBox>")]
public class ConfirmationBox : WebControl
{
    private static readonly ILog Log = LogManager.GetLogger(typeof(ConfirmationBox));

    private Button _okayButton;
    private Button _cancelButton;

    public event EventHandler OkayClicked;
    public event EventHandler CancelClicked;

    public virtual void OnOkayClicked(object sender, EventArgs eventArgs)
    {
        if (OkayClicked != null)
            OkayClicked(sender, eventArgs);
    }

    public virtual void OnCancelClicked(object sender, EventArgs eventArgs)
    {
        if (CancelClicked != null)
            CancelClicked(sender, eventArgs);
    }

    protected override void OnPreRender(EventArgs e)
    {
        _okayButton = new Button {ID = "ConfirmBoxOkayButton", CssClass = "button", Text = "OK"};
        _okayButton.Click += new EventHandler(OnOkayClicked);

        _cancelButton = new Button {ID = "ConfirmBoxCancelButton", CssClass = "button", Text = "Cancel"};
        _cancelButton.Click += new EventHandler(OnCancelClicked);
    }

    [Bindable(true)]
    [Category("Appearance")]
    [DefaultValue("")]
    [Localizable(true)]
    public string Text
    {
        get
        {
            var s = (String)ViewState["Text"];
            return (s ?? String.Empty);
        }

        set
        {
            ViewState["Text"] = value;
        }
    }

    [Bindable(true)]
    [Category("Appearance")]
    [DefaultValue("Hidden")]
    public ConfirmationBoxType BoxType
    {
        get
        {
            return (ConfirmationBoxType)ViewState["BoxType"];
        }

        set
        {
            ViewState["BoxType"] = value;
        }
    }

    [Bindable(true)]
    [Category("Appearance")]
    [DefaultValue("None")]
    public ConfirmationBoxButtons BoxButtons
    {
        get
        {
            return (ConfirmationBoxButtons)ViewState["BoxButtons"];
        }

        set
        {
            ViewState["BoxButtons"] = value;
        }
    }

    protected override HtmlTextWriterTag TagKey
    {
        get
        {
            return HtmlTextWriterTag.Div;
        }
    }

    protected override void AddAttributesToRender(HtmlTextWriter writer)
    {
        writer.AddAttribute(HtmlTextWriterAttribute.Id, "alerts");
        base.AddAttributesToRender(writer);
    }

    protected override void RenderContents(HtmlTextWriter writer)
    {
        if (Site != null && Site.DesignMode)
        {
            writer.Write("[" + ID + "]");
        }
        else
        {
            if (BoxType == ConfirmationBoxType.Hidden)
                return;

            var theme = HttpContext.Current.Profile["UserTheme"].ToString();

            writer.AddAttribute(HtmlTextWriterAttribute.Id, "confirmBox");
            writer.AddAttribute(HtmlTextWriterAttribute.Class, "rt-alert " + RenderBoxType());
            writer.RenderBeginTag(HtmlTextWriterTag.Div);

            writer.AddAttribute(HtmlTextWriterAttribute.Src, string.Format("{0}/{1}/pixel.gif", ResolveUrl("~/App_Themes"), (string.IsNullOrEmpty(theme)) ? "Default" : theme));
            writer.AddAttribute(HtmlTextWriterAttribute.Class, "icon");
            writer.AddAttribute(HtmlTextWriterAttribute.Alt, "Alert icon");
            writer.RenderBeginTag(HtmlTextWriterTag.Img);
            writer.RenderEndTag();

            writer.AddAttribute(HtmlTextWriterAttribute.Class, "rt-alert-content");
            writer.RenderBeginTag(HtmlTextWriterTag.Div);
            writer.Write(Text);
            writer.RenderEndTag();

            writer.AddAttribute(HtmlTextWriterAttribute.Type, "button");
            writer.AddAttribute(HtmlTextWriterAttribute.Class, "close");
            writer.AddAttribute(HtmlTextWriterAttribute.Onclick, "$(\"#alerts\").hide()");
            writer.RenderBeginTag(HtmlTextWriterTag.Button);
            writer.Write("close");
            writer.RenderEndTag();

            if (BoxButtons != ConfirmationBoxButtons.None)
            {
                writer.AddAttribute(HtmlTextWriterAttribute.Class, "rt-alert-buttons");
                writer.RenderBeginTag(HtmlTextWriterTag.Div);
                if (BoxButtons == ConfirmationBoxButtons.Okay || BoxButtons == ConfirmationBoxButtons.OkayCancel)
                    _okayButton.RenderControl(writer);
                if (BoxButtons == ConfirmationBoxButtons.Cancel || BoxButtons == ConfirmationBoxButtons.OkayCancel)
                    _cancelButton.RenderControl(writer);
                writer.RenderEndTag();
            }

            writer.RenderEndTag();
        }
    }

    private string RenderBoxType()
    {
        switch (BoxType)
        {
            case ConfirmationBoxType.Success:
                return "rt-alert-success";
            case ConfirmationBoxType.Warn:
                return "rt-alert-warn";
            case ConfirmationBoxType.Error:
                return "rt-alert-error";
            case ConfirmationBoxType.Info:
                return "rt-alert-info";
        }

        return string.Empty;
    }
}
public enum ConfirmationBoxType
{
隐藏的,
成功,,
警告,,
错误,
信息
}
公共枚举确认框按钮
{
没有一个
可以
取消,
好的,取消
}
[默认属性(“文本”)]
[ToolboxData(“”)
公共类确认框:网络控制
{
private static readonly ILog Log=LogManager.GetLogger(typeof(ConfirmationBox));
私人按钮_okayButton;
专用按钮_取消按钮;
公共事件事件处理程序OkayClicked;
已单击公共事件事件处理程序;
已单击的公共虚拟对象(对象发送方、事件args、事件args)
{
如果(单击确定!=null)
确定已单击(发件人、事件参数);
}
取消单击时的公共虚拟无效(对象发送方,EventArgs EventArgs)
{
如果(取消单击!=null)
取消单击(发件人、事件参数);
}
受保护的覆盖无效OnPreRender(EventArgs e)
{
_okayButton=新按钮{ID=“ConfirmBoxOkayButton”,CssClass=“Button”,Text=“OK”};
_单击+=新建事件处理程序(单击);
_cancelButton=新按钮{ID=“ConfirmBoxCancelButton”,CssClass=“Button”,Text=“Cancel”};
_cancelButton.Click+=新建事件处理程序(OnCancelClick);
}
[可装订(真实)]
[类别(“外观”)]
[默认值(“”)
[可本地化(正确)]
公共字符串文本
{
得到
{
var s=(字符串)ViewState[“Text”];
返回(s??字符串。空);
}
设置
{
ViewState[“文本”]=值;
}
}
[可装订(真实)]
[类别(“外观”)]
[默认值(“隐藏”)]
公共确认BoxType BoxType
{
得到
{
返回(确认BoxType)视图状态[“BoxType”];
}
设置
{
ViewState[“BoxType”]=值;
}
}
[可装订(真实)]
[类别(“外观”)]
[默认值(“无”)]
公共确认框按钮框按钮
{
得到
{
返回(确认框按钮)视图状态[“框按钮”];
}
设置
{
ViewState[“BoxButtons”]=值;
}
}
受保护的覆盖HtmlTextWriterTag标记键
{
得到
{
返回HtmlTextWriterTag.Div;
}
}
受保护的覆盖无效AddAttributesToRender(HtmlTextWriter编写器)
{
writer.AddAttribute(HtmlTextWriterAttribute.Id,“警报”);
base.AddAttributesToRender(编写器);
}
受保护的覆盖无效呈现内容(HtmlTextWriter)
{
if(Site!=null&&Site.DesignMode)
{
writer.Write(“[”+ID+“]);
}
其他的
{
if(BoxType==ConfirmationBoxType.Hidden)
返回;
var theme=HttpContext.Current.Profile[“UserTheme”].ToString();
writer.AddAttribute(HtmlTextWriterAttribute.Id,“confirbox”);
writer.AddAttribute(HtmlTextWriterAttribute.Class,“rt警报”+RenderBox());
writer.RenderBeginTag(htmltextwittertag.Div);
writer.AddAttribute(HtmlTextWriterAttribute.Src,string.Format(“{0}/{1}/pixel.gif”),ResolveUrl(“~/App_Themes”),(string.IsNullOrEmpty(theme))?“Default”:theme));
writer.AddAttribute(HtmlTextWriterAttribute.Class,“icon”);
writer.AddAttribute(HtmlTextWriterAttribute.Alt,“警报图标”);
writer.RenderBeginTag(htmltextwittertag.Img);
writer.renderndtag();
writer.AddAttribute(HtmlTextWriterAttribute.Class,“rt警报内容”);
writer.RenderBeginTag(htmltextwittertag.Div);
作者:写(文本);
writer.renderndtag();
writer.AddAttribute(HtmlTextWriterAttribute.Type,“按钮”);
writer.AddAttribute(HtmlTextWriterAttribute.Class,“close”);
writer.AddAttribute(HtmlTextWriterAttribute.Onclick,“$(\”\35; alerts\”).hide()”;
writer.RenderBeginTag(HtmlTextWriterTag.Button);
作者:写(“结束”);
writer.renderndtag();
如果(BoxButtons!=确认BoxButtons.None)
{
writer.AddAttribute(HtmlTextWriterAttribute.Class,“rt警报按钮”);
writer.RenderBeginTag(htmltextwittertag.Div);
如果(BoxButtons==确认BoxButtons.OK | | BoxButtons==确认BoxButtons.OK取消)
_OK按钮。渲染控制(编写器);
如果(BoxButtons==确认BoxButtons.Cancel | | BoxButtons==确认BoxButtons.OkayCancel)
_取消按钮。渲染控件(编写器);
writer.renderndtag();
}
writer.renderndtag();
}
}
私有字符串RenderBoxType()
{
开关(箱式)
{
案例确认BoxType。成功:
返回“rt警报成功”;
案例确认BoxType。警告:
返回“rt alert warn”;
案例确认BoxType。错误:
返回“rt警报错误”;
案例确认BoxType.信息:
返回“rt警报信息”;
}
返回字符串。空;
}
}

为自定义事件处理程序创建一个单独的方法,如下所示:

protected virtual void OnOkayClicked(EventArgs e)
{
    if (OkayClicked!= null)
        OkayClicked(this, e);
}
protected void OkayButton_Click(object sender, EventArgs e)
{
     //call your event handler method
     this.OnOkayClicked(EventArgs.Empty);
}
更改按钮单击事件的名称并使其受到保护,如下所示:

protected virtual void OnOkayClicked(EventArgs e)
{
    if (OkayClicked!= null)
        OkayClicked(this, e);
}
protected void OkayButton_Click(object sender, EventArgs e)
{
     //call your event handler method
     this.OnOkayClicked(EventArgs.Empty);
}
测试一下,看看它是否成功