Управляйте обработчиком события доступа в классе веб-формы - PullRequest
1 голос
/ 12 марта 2010

У меня есть пользовательский веб-контроль. Внутри этого элемента управления я добавляю кнопку и хочу получить доступ к EventHandler, который находится в WebForm, где элемент управления включен. Обработчик обрабатывает элементы управления из 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);

   }}

1 Ответ

1 голос
/ 12 марта 2010

Обработка вашей кнопки событием на веб-форме не рекомендуется. В идеале, ваш контроль должен быть полностью автономным. Вместо этого вы можете обработать событие нажатия кнопки внутри элемента управления, а затем вызвать другое событие, которое может быть обработано 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, которое будет обработано методом btnSave_Click в WebForm, содержащем элемент управления.

...