Раскрывающийся список ASP.NET в Codebehind против страницы ASPX - PullRequest
4 голосов
/ 17 февраля 2010

Я создаю выпадающий список в codebehind и не могу получить событие selectedindexlated для автоматического запуска. Он отлично работает, когда помещается прямо на страницу ASPX, но мне нужно, чтобы он был в коде позади.

Это не работает:

var deptList = new DropDownList
    {
        ID = "deptList",
        DataSource = departments,
        DataTextField = "deptname",
        DataValueField = "deptid",
        AutoPostBack = true,
        EnableViewState = true
    };

deptList.SelectedIndexChanged += new EventHandler(deptList_SelectedIndexChanged);
deptList.DataSource = departments;
deptList.DataTextField = "deptname";
deptList.DataValueField = "deptid";

if (!IsPostBack)
    deptList.DataBind();

deptList.Items.Insert(0, new ListItem("---Select Department---", string.Empty));

writer.Write("Select a department: ");
deptList.RenderControl(writer);

но это работает:

<asp:DropDownList ID="deptList" AutoPostBack="true" runat="server" OnSelectedIndexChanged="deptList_SelectedIndexChanged"></asp:DropDownList>

Ответы [ 5 ]

7 голосов
/ 17 февраля 2010

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

Вы, вероятно, делаете это в событии Load, что слишком поздно. Попробуйте добавить его во время события Init или переопределить метод CreateChildControls.

Редактировать: Как упоминал Дейв Сверски, убедитесь, что вы делаете это при КАЖДОМ запросе страницы, включая постбэки.

2 голосов
/ 17 февраля 2010

Чтобы уточнить ответ Майка Муни: вам также нужно убедиться, что вы добавляете элемент управления обратно в дерево элементов управления при каждой обратной передаче. Дерево элементов управления воссоздается при каждой обратной передаче, считанной из разметки. Если вы добавите его один раз программно и никогда больше, в дереве не будет элемента управления для получения события.

2 голосов
/ 17 февраля 2010

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

Пример:

<asp:DropDownList ID="deptList" AutoPostBack="true" runat="server"></asp:DropDownList>

Затем в коде позади (Page_Load):

deptList.SelectedIndexChanged += new EventHandler(deptList_SelectedIndexChanged);

if (!IsPostBack)
{
     deptList.DataTextField = "deptname";
     deptList.DataValueField = "deptid";
     deptList.DataSource = departments;
     deptList.DataBind();
     deptList.Items.Insert(0, new ListItem("---Select Department---", string.Empty));
}
0 голосов
/ 13 ноября 2012

Проблема, с которой я столкнулся, заключалась в том, что если бы в раскрывающемся списке не было AutoPostBack = true, то функция никогда не вызывалась бы.

0 голосов
/ 17 февраля 2010

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

...