C# 控件访问web窗体类中的事件处理程序

C# 控件访问web窗体类中的事件处理程序,c#,asp.net,web-controls,C#,Asp.net,Web Controls,我有一个自定义网络控制。在该控件中,我添加了一个按钮,希望它访问包含该控件的WebForm上的EventHandler。处理程序处理来自WebForm的控件,因此它必须在那里。我可能会设法使按钮脱离控制,但出于组织的考虑,最好是将其保持在控制状态 public class LanguageSelection : WebControl { private List<Language> _Languages; private CSSImageButton btnOk =

我有一个自定义网络控制。在该控件中,我添加了一个按钮,希望它访问包含该控件的WebForm上的EventHandler。处理程序处理来自WebForm的控件,因此它必须在那里。我可能会设法使按钮脱离控制,但出于组织的考虑,最好是将其保持在控制状态

public class LanguageSelection : WebControl
{
    private List<Language> _Languages;

    private CSSImageButton btnOk = new CSSImageButton();
    private CSSImageButton btnClose = new CSSImageButton();

    public List<Language> Languages
    {
        set { _Languages = value; }
        get { if (_Languages != null) return _Languages; else; _Languages = LanguageManager.Select(); return _Languages;  }
    }

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);

        Control parent;
        Control container;

        btnClose.CssClass = "sprReprove";
        btnClose.DivClass = "float-right";
        btnClose.OnClientClick = "$('#languagesOptions').hide('slow')";

        btnOk.CssClass = "sprApprove";
        btnOk.DivClass = "float-right";
        btnOk.Click += new ImageClickEventHandler("btnSave_Click"); // this method here is on the webform where i included the control

        // Get a reference to the ScriptManager object for the page
        // if one exists.
        ScriptManager sm = ScriptManager.GetCurrent(Page);

        if (sm == null || !sm.EnablePartialRendering)
        {
            // If partial rendering is not enabled, set the parent
            // and container as a basic control.
            container = new Control();
            parent = container;
        }
        else
        {
            // If partial rendering is enabled, set the parent as
            // a new UpdatePanel object and the container to the 
            // content template of the UpdatePanel object.
            UpdatePanel up = new UpdatePanel();
            container = up.ContentTemplateContainer;
            parent = up;
        }

        container.Controls.Add(new LiteralControl("<div id=\"languagesOptions\" class=\"divSelectLanguages\">"));
        container.Controls.Add(new LiteralControl(" <strong>Salvar conteúdo nestes idiomas?</strong>"));
        container.Controls.Add(new LiteralControl("<table class=\"tblSelectLanguages\">"));


        int i = 0;
        foreach (Language l in Languages)
        {
            CheckBox cb = new CheckBox();
            cb.Enabled = false;
            if(i % 2 == 0) container.Controls.Add(new LiteralControl("</tr><tr>"));
            container.Controls.Add(new LiteralControl("<td>"));
            container.Controls.Add(cb);
            container.Controls.Add(new LiteralControl(l.FullName));
            container.Controls.Add(new LiteralControl("</td>"));
            i++;


        }
        container.Controls.Add(new LiteralControl("</tr>"));
        container.Controls.Add(new LiteralControl("</table>"));


        container.Controls.Add(btnOk);
        container.Controls.Add(btnClose);

        container.Controls.Add(new LiteralControl("</div>"));

        Controls.Add(parent);

   }}
公共类语言选择:网络控制
{
私人名单(语言);;
私有CSSImageButton btnOk=新CSSImageButton();
私有CSSImageButton btnClose=新CSSImageButton();
公共列表语言
{
设置{u语言=值;}
获取{if(_Languages!=null)返回_Languages;else;_Languages=LanguageManager.Select();返回_Languages;}
}
受保护的覆盖无效OnInit(事件参数e)
{
碱基.奥尼特(e);
对照亲本;
控制容器;
btnClose.CssClass=“sprReprove”;
btnClose.DivClass=“向右浮动”;
btnClose.OnClientClick=“$('#语言选项”).hide('slow');
btnOk.CssClass=“sprApprove”;
btnOk.DivClass=“向右浮动”;
btnOk.Click+=newimageclickeventhandler(“btnSave_Click”);//此方法位于包含控件的webform上
//获取对页面的ScriptManager对象的引用
//如果有的话。
ScriptManager sm=ScriptManager.GetCurrent(第页);
if(sm==null | |!sm.EnablePartialRendering)
{
//如果未启用部分渲染,请设置父级渲染
//并将容器作为基本控件。
容器=新控件();
父项=容器;
}
其他的
{
//如果启用了部分渲染,请将父级设置为
//一个新的UpdatePanel对象和
//UpdatePanel对象的内容模板。
UpdatePanel up=新的UpdatePanel();
container=up.ContentTemplateContainer;
家长=向上;
}
container.Controls.Add(新的LiteralControl(“”);
container.Controls.Add(新的LiteralControl(“Salvar conteúdo nestes-idiomas?”);
container.Controls.Add(新的LiteralControl(“”);
int i=0;
foreach(语言中的语言l)
{
复选框cb=新复选框();
cb.Enabled=false;
if(i%2==0)container.Controls.Add(newliteralcontrol(“”));
container.Controls.Add(新的LiteralControl(“”);
container.Controls.Add(cb);
container.Controls.Add(新的LiteralControl(l.FullName));
container.Controls.Add(新的LiteralControl(“”);
i++;
}
container.Controls.Add(新的LiteralControl(“”);
container.Controls.Add(新的LiteralControl(“”);
container.Controls.Add(btnOk);
container.Controls.Add(btnClose);
container.Controls.Add(新的LiteralControl(“”);
控件。添加(父级);
}}

不建议让按钮由包含Web表单的事件处理。理想情况下,您的控制应该是完全独立的。相反,您可以做的是在控件内处理按钮单击事件,然后引发另一个事件,该事件可以由WebForm处理

// This event will be handled by the webform
public event EventHandler OkButtonClicked;

protected void btnOk_Click(object sender, EventArgs e)
{
    // Raise the okButtonClicked event
    if (OkButtonClicked != null)
       OkButtonClicked(sender, e);
}

// The btnOk button will be wired to our new event handler
btnOk.Click += new ImageClickEventHandler(btnOk_Click);
在您的网络表单上,您可以有如下内容:

<app:LanguageSelection ID="LanguageSelection1" OnOkButtonClicked="btnSave_Click" runat="server"/>


当在网络控件内单击按钮时,它将由网络控件内的btnOk_Click方法处理。这将引发OkbutonClicked事件,该事件将由包含控件的WebForm中的btnSave_Click方法处理。

不建议让按钮由包含控件的WebForm上的事件处理。理想情况下,您的控制应该是完全独立的。相反,您可以做的是在控件内处理按钮单击事件,然后引发另一个事件,该事件可以由WebForm处理

// This event will be handled by the webform
public event EventHandler OkButtonClicked;

protected void btnOk_Click(object sender, EventArgs e)
{
    // Raise the okButtonClicked event
    if (OkButtonClicked != null)
       OkButtonClicked(sender, e);
}

// The btnOk button will be wired to our new event handler
btnOk.Click += new ImageClickEventHandler(btnOk_Click);
在您的网络表单上,您可以有如下内容:

<app:LanguageSelection ID="LanguageSelection1" OnOkButtonClicked="btnSave_Click" runat="server"/>


当在网络控件内单击按钮时,它将由网络控件内的btnOk_Click方法处理。然后,这将引发OkButtonClicked事件,该事件将由包含该控件的WebForm中的btnSave_Click方法处理。

Nice!非常感谢。我明天会试试,然后回来给你一个反馈,告诉你这对我是如何起作用的。很好!非常感谢。我明天会试试,然后回来给你一个反馈,告诉你这对我是如何起作用的。