Добрый день.ASP Lifecycle с динамическим DropDownList и обратной обработкой
Я пытаюсь создать DropDownList населенную 2-мя способами:
- Вариантов из перечисления, перечисляя каждый возможный вариант.
- Выбранное значение из таблицы базы данных.
Выбранный DropDownList SelectedIndexChanged позаботится об обновлении базы данных для меня.
Обратите внимание, что элемент управления работает уже, но я думаю, что я не понимаю жизненный цикл правильно и хотел бы получить некоторые пояснения.
На страницеПроизводим таблицу с заголовками и одну из ячеек с моим DropDownList.
//Essentially an ArrayList with "row" information (it uses a Field class with //several parameters, each corresponding to 1 column in the table GenericFieldsCollection data = new GenericFieldsCollection(); data.FillFieldList(); Table TableToEdit = new Table(); TableHeaderCell Header_FieldName = new TableHeaderCell(); (...) foreach (GenericField row in data.FieldList) { (...) //The cell with the DDL: TableCell Column_GraphName = new TableCell(); Column_GraphName.Controls.Add(GenerateGraphSelectionDropdown()); (...) }
Очевидно, что если я не генерировать его здесь, замковое события не будут работать.
Эта процедура запрашивает базу данных только с помощью Select, никаких обновлений не производится.
После первого (! PostBack) вызова последующие вызовы могут быть вызваны путем изменения индекса DropDownList (у него есть AutoPostBack = true).
Итак, мой PageInit запускается снова, как и ожидалось. И, после загрузки Number 15 in here happens ( OnXXX (событие управления)), и моя база данных обновляется.
Позже в цикле (OnPreRender), я попробовал очистка анкера Div, который я использую для этой таблицы всех элементов управления, и снова вызовите мой GenerateFieldCollectionTable(). Поскольку мой запрос на обновление в событии SelectedIndexChanged DropDownList уже выполнен, я ожидал увидеть обновленные значения. Тем не менее, это покажет старое значение и разрушит поведение (я ничего не смогу изменить, и в базе данных изменений не будет).
После недолгого тестирования я обнаружил, что Page_PreRender имея эту линию, является вопрос:
------> //TableToEditGraphFields.Controls.Clear();
GenerateFieldCollectionTable();
Очистка органов управления TableToEditGraphFields, действие, которое происходит ПОСЛЕ кликах (с Control.OnPreRender - # 22, а OnSelectedIndexChanged - №15) означает, что на следующем PostBack элементы управления не будут вызывать события кликов, поскольку они были очищены. Есть ли часть цикла, в которой я могу обработать событие Click, перестроить элементы управления и все еще иметь возможность их щелкнуть на следующем PostBack?
Заранее спасибо.
EDIT: код, который генерирует таблицу:
GenericFieldsCollection data = new GenericFieldsCollection();
data.FillFieldList();
Table TableToEdit = new Table();
TableToEdit.CssClass = "table";
TableRow Headers = new TableRow();
TableHeaderCell Header_FieldName = new TableHeaderCell();
Header_FieldName.Text = "Field Name";
Headers.Cells.Add(Header_FieldName);
//Repeat for each header
TableToEdit.Rows.Add(Headers);
foreach (GenericField row in data.FieldList)
{
TableRow currentRow = new TableRow();
//Repeat for each column; example with the "Order" column
TableCell Column_Order = new TableCell();
TextBox editableOrder = new TextBox();
editableOrder.Attributes.Add("FieldName", row.Name);
editableOrder.Attributes.Add("FieldTable", row.Table);
editableOrder.AutoPostBack = true;
editableOrder.TextChanged += EditableOrder_TextChanged;
editableOrder.Text = row.Order.ToString();
Column_Order.Controls.Add(editableOrder);
currentRow.Cells.Add(Column_Order);
TableToEdit.Rows.Add(currentRow);
}
TableToEditGraphFields.Controls.Add(TableToEdit);
Если очистить элементы управления, необходимо перебрать их и повторно регистрировать любые события, которые вы добавили в первую очередь. Предположим, что все события были - = и просто + = они снова –
Я считаю, что мой GenerateFieldCollectionTable(); должен позаботиться об этом (добавлен в главный пост)? Все поля являются динамическими, и если мое понимание правильное, Clear() удаляет элементы управления - я их повторно добавляю. Возможно, я не знаю о значении «перерегистрации» их - будет editableOrder.TextChanged + = EditableOrder_TextChanged; не так ли? – Cloud