Кнопка на панели не вызывает событие родительского включения - PullRequest
2 голосов
/ 16 мая 2011

Название не совсем точное, у меня есть элемент управления Container со свойством типа PanelControlCollection, которое в основном представляет собой коллекцию PanelControl:

public class PanelControl : System.Web.UI.WebControls.Panel
{
    public string Title { get; set; }
}

public class PanelControlCollection : Collection<PanelControl> {}

Мой пользовательский пользовательский элемент управления:

public partial class FormSlideShow : BaseUserControl
{
    [PersistenceMode(PersistenceMode.InnerProperty)]
    public PanelControlCollection Panels Title { get; set; }

    protected override void Render(HtmlTextWriter writer)
    {
        foreach(var panel in Panels)
        {
            ContentPlaceHolder.Controls.Add(
                new LiteralControl("<fieldset class='step' Title='" + panel.Title + "'>"));
            ContentPlaceHolder.Controls.Add(panel);
            ContentPlaceHolder.Controls.Add(
                new LiteralControl("</fieldset>"));
        }
        base.Render(writer);
    }
}

Я хотел иметь возможность создать пользовательский элемент управления и добавить страницы в разметке (код в Default.aspx):

<ctrl:FormSlide runat="server" ID="frmSlide">
    <Panels>
        <ctrl:PanelControl runat="server" ID="page1"><asp:Button runat="server" ID="btnTest" OnClick="btnTest_Onclick" /></ctrl:PanelControl>
        <ctrl:PanelControl runat="server" ID="PanelControl1">Page 2</ctrl:PanelControl>
    </Panels>
</ctrl:FormSlide>

У меня вопрос, хочу ли я разместить элемент управления вобычная страница aspx, как я могу подключить свой элемент управления Button (btnTest) к событию OnClick в коде позади default.aspx?Если я поместил обычный элемент управления Panel с помощью кнопки, я могу прикрепить события к onclick, но не с помощью своего пользовательского элемента управления.

Кстати, вот мой код на default.aspx, код, который я хочу выполнить, но't:

protected void btnTest_Onclick(object sender, EventArgs e)
{
    Response.Redirect("http://www.google.com");
}

Спасибо.

1 Ответ

2 голосов
/ 16 мая 2011

Попробуйте переместить это:

foreach(var panel in Panels)
{
    ContentPlaceHolder.Controls.Add(
        new LiteralControl("<fieldset class='step' Title='" + panel.Title + "'>"));
    ContentPlaceHolder.Controls.Add(panel);
    ContentPlaceHolder.Controls.Add(
        new LiteralControl("</fieldset>"));
}
base.Render(writer);

в OnInit вместо Render. Я думаю Render слишком поздно для регистрации событий PostBack в ASP.NET. Я смог воспроизвести вашу проблему и затем устранить ее, переместив этот фрагмент кода.

Конечно, base.Render(writer); следует заменить на base.OnInit(e);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...