У меня есть элемент управления, который я хочу создать. Вот простой пример того, что я должен был выполнить.
Я хочу, чтобы элемент управления содержал кнопку.
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>"));
}
}
}
Итак, из комментариев я пробовал это. Самый простой из экзаменов, по-прежнему нет. Есть ли что-то, что я принципиально не хватает?
public class WebCustomControl1 : WebControl
необходимо
public class WebCustomControl1 : WebControl, INamingContainer
что он. что все, что было необходимо для решения этой проблемы с обратной записью.
Переопределите метод CreateChildControls и создайте/добавьте кнопку (и зарегистрируйте обработчик) в этом методе.
Использование OnInit/OnLoad для создания таких элементов управления является неправильным и приведет к непоследовательному поведению (например, к тому, что вы испытываете).
Изменить: вы также можете попробовать установить button.ID так, чтобы он был одинаковым при каждой обратной передаче, возможно, поднятое событие не видит его по этой причине.
Продемонстрируйте определение своего класса управления.
На ваш контроль наследуется Control, WebControl или CompositeControl. Попробуйте наследовать от CompositeControl и посмотрите, поможет ли это.
Итак, ваша кнопка правильно отображает страницу и вызывает обратную передачу, когда пользователь нажимает на нее, но код OnClick никогда не запускается?
Помните, что всякий раз, когда вы выполняете обратную передачу, вы работаете с совершенно новым экземпляром вашего класса страниц. Часть процесса обратной передачи запускает любое событие, инициированное пользователем. Чтобы это произошло, процессор asp.net должен знать о событии в определенной точке жизненного цикла страницы. На этом этапе ваша кнопка уже должна быть на странице с зарегистрированным обработчиком событий. Если этого не произойдет, ваше событие не будет срабатывать. Попробуйте переместить создание кнопки ранее в жизненном цикле страницы.
Проверить идентификатор кнопки управления перед обратной передачей и после обратной передачи. Если это не то же самое, это не сработает.
При необходимости вы можете переписать идентификатор самостоятельно.
Это может быть случай назначения обработчиков хорошо после возникновения события.
Моя общая практика при работе с элементами управления: