SelectedIndexChanged для программно созданного выпадающего списка в ASP.NET запускается несколько раз - PullRequest
0 голосов
/ 12 марта 2010

Рассмотрим следующее:

dim dropdownlist1 as new dropdownlist
dim dropdownlist2 as new dropdownlist
dim dropdownlist3 as new dropdownlist

dropdownlist1.AutoPostBack = true
dropdownlist2.AutoPostBack = true
dropdownlist3.AutoPostBack = true

AddHandler dropdownlist1.SelectedIndexChanged, AddressOf SomeEvent
AddHandler dropdownlist2.SelectedIndexChanged, AddressOf SomeEvent
AddHandler dropdownlist3.SelectedIndexChanged, AddressOf SomeEvent

Edit: Я хочу, чтобы событие запускалось независимо от того, какой выпадающий список выбран. Редактировать:

SomeEvent срабатывает, как и ожидалось, при изменении любого из выпадающего списка. Однако если, скажем, DropdownList2 сделал выбор, то я делаю выбор либо с DropDownList1, либо с DropdownList3, затем SomeEvent запускается снова. Что является причиной такого поведения и как я могу получить только одно повышение этого события?

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

Ответы [ 3 ]

2 голосов
/ 12 марта 2010

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

1 голос
/ 12 марта 2010

Это то, что у меня есть, и оно отлично работает (извините, я парень на C #)

protected void Page_Load(object sender, EventArgs e)
    {       
            DropDownList objlist1 = new DropDownList();
            DropDownList objlist2 = new DropDownList();
            DropDownList objlist3 = new DropDownList();

            objlist1.Items.Add("aaa");
            objlist1.Items.Add("bbb");
            objlist2.Items.Add("cc");
            objlist2.Items.Add("ddd");
            objlist3.Items.Add("eee");
            objlist3.Items.Add("fff");

            objlist1.AutoPostBack = true;
            objlist2.AutoPostBack = true;
            objlist3.AutoPostBack = true;

            objlist1.SelectedIndexChanged += new EventHandler(objlist1_SelectedIndexChanged);
            objlist2.SelectedIndexChanged += new EventHandler(objlist1_SelectedIndexChanged);
            objlist3.SelectedIndexChanged += new EventHandler(objlist1_SelectedIndexChanged);

            form1.Controls.Add(objlist1);
            form1.Controls.Add(objlist2);
            form1.Controls.Add(objlist3);        
    }

    void objlist1_SelectedIndexChanged(object sender, EventArgs e)
    {
        Response.Write("change happened");
    }

Каждый раз, когда раскрывающийся список изменяется, он пишет Изменение произошло (проверяется с точкой останова, и это происходит только один раз)

0 голосов
/ 12 марта 2010

Не уверен, поможет ли это, но где в жизненном цикле страницы вы создаете элементы управления?

Мне обычно нравится вызывать EnsureChildControls во время инициализации страницы, поэтому все элементы управления создаются до загрузки ViewState и, безусловно, перед постобработкой.

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