Asp.NET Server Control Postback

2

У меня есть элемент управления, который я хочу создать. Вот простой пример того, что я должен был выполнить.

Я хочу, чтобы элемент управления содержал кнопку.

Button b = new Button();
b.Text = "Test";
b.Click += new EventHandler(b_Click);

this.Controls.Add(b);

Теперь управление отображает штраф, кнопка отображается на странице. Сердце проблемы, с которой я сталкиваюсь, заключается в том, что обработчик событий b_Click никогда не запускается.

protected void b_Click(object sender, EventArgs e)
{
    throw new NotImplementedException();
}

Любая помощь здесь будет высоко оценена. Я не хочу использовать User Control здесь для чисто эгоистических причин и хотел бы полностью инкапсулировать это в одну DLL.

Спасибо заранее.

ИЗМЕНИТЬ **

namespace ClassLibrary1
{
    [DefaultProperty("Text")]
    [ToolboxData("<{0}:WebCustomControl1 runat=server></{0}:WebCustomControl1>")]
    public class WebCustomControl1 : WebControl
    {

        protected override void CreateChildControls()
        {
            Button b = new Button();
                    b.ID = "button";
            b.Text = "Click Me";
            b.Click += new EventHandler(b_Click);

            this.Controls.Add(b);

            base.CreateChildControls();
        }

        protected void b_Click(object sender, EventArgs e)
        {
            this.Controls.Add(new LiteralControl("<p>Click!</p>"));
        }

    }
}

Итак, из комментариев я пробовал это. Самый простой из экзаменов, по-прежнему нет. Есть ли что-то, что я принципиально не хватает?

Теги:
user-controls
events
postback

6 ответов

6
Лучший ответ
public class WebCustomControl1 : WebControl

необходимо

public class WebCustomControl1 : WebControl, INamingContainer

что он. что все, что было необходимо для решения этой проблемы с обратной записью.

  • 0
    хорошо сделано !!! Продолжай
  • 0
    Это все, что мне было нужно - была такая же проблема
Показать ещё 1 комментарий
3

Переопределите метод CreateChildControls и создайте/добавьте кнопку (и зарегистрируйте обработчик) в этом методе.

Использование OnInit/OnLoad для создания таких элементов управления является неправильным и приведет к непоследовательному поведению (например, к тому, что вы испытываете).

Изменить: вы также можете попробовать установить button.ID так, чтобы он был одинаковым при каждой обратной передаче, возможно, поднятое событие не видит его по этой причине.

  • 0
    CreateChildControls вызывается во время события Control.Init. Хотя переопределение OnInit может быть неправильным (зависит от того, что вы пытаетесь сделать), обработка Control.Init - нет. И не забудьте вызвать base.CreateChildControls, чтобы убедиться, что ваши базовые классы инициализированы правильно.
  • 1
    CreateChildControls может быть вызван во время Control.Init. Однако его также можно вызывать из других мест (EnsureChildControls можно вызывать в любой точке).
2

Продемонстрируйте определение своего класса управления.

На ваш контроль наследуется Control, WebControl или CompositeControl. Попробуйте наследовать от CompositeControl и посмотрите, поможет ли это.

1

Итак, ваша кнопка правильно отображает страницу и вызывает обратную передачу, когда пользователь нажимает на нее, но код OnClick никогда не запускается?

Помните, что всякий раз, когда вы выполняете обратную передачу, вы работаете с совершенно новым экземпляром вашего класса страниц. Часть процесса обратной передачи запускает любое событие, инициированное пользователем. Чтобы это произошло, процессор asp.net должен знать о событии в определенной точке жизненного цикла страницы. На этом этапе ваша кнопка уже должна быть на странице с зарегистрированным обработчиком событий. Если этого не произойдет, ваше событие не будет срабатывать. Попробуйте переместить создание кнопки ранее в жизненном цикле страницы.

0

Проверить идентификатор кнопки управления перед обратной передачей и после обратной передачи. Если это не то же самое, это не сработает.

При необходимости вы можете переписать идентификатор самостоятельно.

0

Это может быть случай назначения обработчиков хорошо после возникновения события.

Моя общая практика при работе с элементами управления:

  • Использовать событие Control.Init для инициализации всего (текст по умолчанию, обработчики, размер, состав и т.д.), а также инициализировать дочерние элементы управления.
  • Используйте событие Control.Load для обработки любой операции привязки данных (на основе свойств/полей, заданных во время события Init).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню