Программная привязка события в приложении ASP.NET 4.0 - PullRequest
0 голосов
/ 01 апреля 2011

Я большую часть дня искал ответ на этот вопрос, но, похоже, я не смог найти ответ, так что вот моя ситуация. У меня есть ModalPopupExtender в GridView, в котором я динамически создаю несколько LinkButtons.

for (int i = 0; i < dtEmployees.Rows.Count; i++)
                {

                    lbEmployee = new LinkButton();
                    lbEmployee.Text = dtEmployees.Rows[i][0].ToString();
                    EventInfo lbEmployeeEvent = lbEmployee.GetType().GetEvent("Click");
                    lbEmployeeEvent.AddEventHandler(lbEmployee, new EventHandler(this.AutomaticSearch));
                    lbEmployee.ID = "lbPnlEmployee" + manager + i;

                    phEmployees.Controls.Add(lbEmployee);

                    if (i != dtEmployees.Rows.Count - 1)
                        phEmployees.Controls.Add(new LiteralControl("<br />"));
                }

так я продолжаю. Я обнаружил, что AddEventHandler был лучшим способом сделать это.

Моя проблема в том, что когда я нажимаю на кнопку LinkButton, я вижу, что страница выполняет обратную передачу, но ничего не происходит. Когда я нажимаю на LinkButton, он должен вызвать функцию AutomaticSearch , которая находится в фоновом коде.

Я поставил точку останова в указанной функции и обнаружил, что после нажатия кнопки LinkButton она никогда не проходит через нее, она переходит непосредственно к функции Page_load.

Вот как выглядит моя функция автоматического поиска:

protected void AutomaticSearch(object sender, EventArgs e)
        {
            LinkButton btn = new LinkButton();
            btn = (LinkButton)sender;

            //a substring is needed here because the ID of the link button for the employees is made dynamically
            //and only the first part is hard coded (lbPnlEmployee)
            // if you put a longer length, it will return an error because some IDs are smaller (ie: lbTitle)
            switch (btn.ID.Substring(0,7))
            {
                case "lbDivis":
                    ddlSearchParameter.SelectedIndex = 5;
                    break;
                case "lbLocat":
                    ddlSearchParameter.SelectedIndex = 6;
                    break;
                case "lbTitle":
                    ddlSearchParameter.SelectedIndex = 3;
                    break;
                case "lbPnlDi":
                    ddlSearchParameter.SelectedIndex = 5;
                    break;
                case "lbPnlLo":
                    ddlSearchParameter.SelectedIndex = 6;
                    break;
                case "lbPnlMa":
                    ddlSearchParameter.SelectedIndex = 0;
                    break;
                case "lbPnlEm":
                    ddlSearchParameter.SelectedIndex = 0;
                    break;
            }

            txtValue.Text = btn.Text;

            GridViewBinding("disp_nm", "ASC");
        }

Ответы [ 3 ]

1 голос
/ 01 апреля 2011

Для этого есть пара параметров.Когда создается ссылка на постбэк страницы?Это нужно сделать до завершения загрузки, чтобы событие обратной связи обрабатывалось обратной передачей.

Если вы делаете это, попробуйте еще раз добавить событие в preRender ссылки.Я бы сделал что-то вроде

lbEmployee.PreRender += new EventHandler(LbEmployee_PreRender);

protected void LbEmployee_PreRender(object sender, EventArgs e)
{
    LinkButton link = sender as LinkButton;
    link.Click += new EventHandler(AutomaticSearch);
}
0 голосов
/ 02 апреля 2011

Вы можете попробовать этот синтаксис: lbEmployee = new LinkButton (); lbEmployee.Text = dtEmployees.Rows [i] [0] .ToString (); lbEmployee.Command + = new CommandEventHandler (AutomaticSearch);

private void AutomaticSearch (отправитель объекта, CommandEventArgs e) { // Логика }

0 голосов
/ 01 апреля 2011

Из-за упоминаний о «динамических кнопках ссылок», «GridView» и «Page_load», но без обработчика событий, похоже, что вы страдаете от обычной проблемы ASP.Net Page Lifecycle.

В основном происходит следующее:

  1. Страница инициализирована, Page_Load() событие называется
  2. Page_Load() (возможно) загружает некоторый источник данных, устанавливает источник данных в GridView и вызывает GridView.DataBind()
  3. Некоторый дополнительный обработчик событий в цепочке устанавливает события на кнопках ссылки (я бы предположил OnItemDatabound).

Здесь вам не хватает того, что при обратной передаче, вызванной нажатием на ссылку, Page_load будет запущена снова. Если вы не проверяете, является ли это обратной передачей, сетка будет воссоздана, и все элементы управления, с которыми были связаны события, исчезнут и будут воссозданы. Событие, на которое вы рассчитывали, теперь прошло, так как его владелец просто исчез.

TL; версия DR:

Оберните ваши GridView.Datasource = something; GridView.DataBind(); звонки в оператор if (!IsPostback()) {.

Работа с Postbacks и Page Lifecycle - проклятие существования программиста ASP.Net, если вы не до конца понимаете, как это работает.

Прочитайте эти статьи для получения дополнительной информации:

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