Как подключить обработчик событий к элементу управления ASP.NET, созданному во время выполнения? - PullRequest
4 голосов
/ 10 ноября 2010

Доброе утро всем.

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

protected void loadLinkButton()
{
    ContentPlaceHolder content = (ContentPlaceHolder)this.Master.FindControl("MainContent");
    LinkButton lnk = new LinkButton();
    lnk.ID = "lnikBtn";
    lnk.Text = "LinkButton";
    lnk.Click += new System.EventHandler(lnk_Click);
    content.Controls.Add(lnk);
}

Вот обработчик события:

protected void lnk_Click(object sender, EventArgs e)
{
    Label1.Text = "ok!";
}

Если я запускаю функцию loadLinkButton внутри Page_Load все в порядке,Но когда я пытаюсь запустить loadLinkButton, нажав простую кнопку, создается кнопка ссылки, но событие не обрабатывается.

protected void Button1_Click(object sender, EventArgs e)
{
    loadLinkButton();
}

Есть ли способ ее решить?Или loadLinkButton должен всегда регенерироваться на Page_Load, Page_init и т. Д.

Ответы [ 5 ]

3 голосов
/ 10 ноября 2010

При работе с динамическими элементами управления я всегда добавляю элемент управления в Page_Init , поскольку загрузка состояния представления происходит сразу после инициализации. Если вы добавите его в Page_Load, есть вероятность, что вы потеряете состояние просмотра. Просто убедитесь, что вы предоставили уникальный контрольный идентификатор.

3 голосов
/ 10 ноября 2010

Важно знать, как ASP.Net определяет, какие события вызывать. Источник каждого события передается с использованием скрытого поля:

<input type="hidden" name="__EVENTTARGET" value="" />

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

Однако ваш контроль был добавлен только один раз. Когда происходит обратная передача, ваш элемент управления больше не существует как серверный элемент управления в дереве, и, следовательно, событие никогда не срабатывает.

Простой способ избежать этого - убедиться, что ваши динамические элементы управления добавляются каждый раз, когда страница загружается, либо через событие Page_Init, либо событие Page_Load.

0 голосов
/ 10 ноября 2010

Я не совсем уверен, с какой проблемой вы сталкиваетесь, но вы должны поместить код динамического управления в Page_Init, как предложено @johnofcross:

public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Page_Init(object sender, EventArgs e)
        {
            CreateControls();
        }

        private void CreateControls()
        {
            var lb = new LinkButton();
            lb.Text = "Click Me";
            lb.Click += lb_Click;

            ph.Controls.Add(lb);
            ph.DataBind();
        }

        void lb_Click(object sender, EventArgs e)
        {
            lblMessage.Text = "Button is clicked!"; 
        }
    }
0 голосов
/ 10 ноября 2010

Это происходит потому, что когда вы нажимаете на динамически генерируемую кнопку ссылки, вы делаете обратную передачу на сервер.Там вы делаете совершенно новую загрузку страницы, но ваш первоначальный щелчок по кнопке (который генерирует ссылку) никогда не происходил, поэтому кнопка ссылки никогда не создается, и событие не может быть выдано.

Альтернативой является добавление кнопки ссылки.Вы добавляете динамически, на свою страницу статически, с Visible = false.А когда вы нажмете другую кнопку, сделайте ее видимой.

0 голосов
/ 10 ноября 2010

Вы правы.Это ожидаемое поведение.Page_Load и Page_Init будут событиями, в которые вы должны добавить его.

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