2016-09-15 3 views
1

Добрый день.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); 
+0

Если очистить элементы управления, необходимо перебрать их и повторно регистрировать любые события, которые вы добавили в первую очередь. Предположим, что все события были - = и просто + = они снова –

+0

Я считаю, что мой GenerateFieldCollectionTable(); должен позаботиться об этом (добавлен в главный пост)? Все поля являются динамическими, и если мое понимание правильное, Clear() удаляет элементы управления - я их повторно добавляю. Возможно, я не знаю о значении «перерегистрации» их - будет editableOrder.TextChanged + = EditableOrder_TextChanged; не так ли? – Cloud

ответ

1

«Я не понять жизненный цикл правильно, и хотел бы получить разъяснения.»

Как работает жизненный цикл?

Как вы можете видеть на картинке ниже. Так работает жизненный цикл. Вся информация взята из codedisplay. Для вас есть более подробная информация.

enter image description here

+0

Спасибо, я изучаю это. Я вернусь к тебе, как только я что-то придумаю. – Cloud

 Смежные вопросы

  • Нет связанных вопросов^_^