2013-07-25 4 views
0

У меня проблемы с такими же динамически сгенерированными выпадающими списками и их представлением.Dynamically Generated Dropdowns Postback

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

public void generateFromSheet(OrderedDictionary columns, DataTable oppcolumns, List<string> requiredDrops) 
    { 
     int index = 0; 
     foreach (DictionaryEntry entry in columns) 
     { 
      DropDownList ddl = new DropDownList() 
      { 
       ID = "ddlMapping" + entry.Key.ToString(), 
       DataSource = columns, 
       DataTextField = "Key", 
       DataValueField = "Value", 
       SelectedIndex = index, 
       Enabled = requiredDrops.Contains(entry.Key) ? false : true 
      }; 

      ddl.DataBind(); 

      DropDownList ddl2 = new DropDownList() 
      { 
       ID = "OpportunityMappingDdl" + index, 
       DataSource = oppcolumns, 
       DataTextField = "AttributeDisplayName", 
       DataValueField = "TableColumnName" 
      }; 
      ddl2.DataBind(); 


      HtmlTableCell td = new HtmlTableCell() 
      { 
       ID = "tdMapping" + index 
      }; 
      td.Controls.Add(ddl); 

      HtmlTableCell td2 = new HtmlTableCell() 
      { 
       ID = "tdOppMapping" + index 
      }; 
      td2.Controls.Add(ddl2); 

      HtmlTableRow tr = new HtmlTableRow() 
      { 
       ID = "trMapping" + index 
      }; 
      tr.Cells.Add(td); 
      tr.Cells.Add(td2); 

      tblFileMapping.Rows.Add(tr); 
      index++; 
     } 
    } 

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

public void generateFromViewState() 
    { 
     OrderedDictionary columns = (OrderedDictionary) ViewState["XLColumns"]; 

     int index = 0; 
     foreach (DictionaryEntry entry in columns) 
     { 
      DropDownList ddl = new DropDownList() 
      { 
       ID = "ddlMapping" + entry.Key.ToString(), 
      }; 

      DropDownList ddl2 = new DropDownList() 
      { 
       ID = "OpportunityMappingDdl" + index, 
      }; 

      HtmlTableCell td = new HtmlTableCell() 
      { 
       ID = "tdMapping" + index 
      }; 
      td.Controls.Add(ddl); 

      HtmlTableCell td2 = new HtmlTableCell() 
      { 
       ID = "tdOppMapping" + index 
      }; 
      td2.Controls.Add(ddl2); 

      HtmlTableRow tr = new HtmlTableRow() 
      { 
       ID = "trMapping" + index 
      }; 
      tr.Cells.Add(td); 
      tr.Cells.Add(td2); 

      tblFileMapping.Rows.Add(tr); 
      index++; 
     } 
    } 

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

Так пара вещей здесь не так:

  • На Page_Load элементы управления воссозданы, но их состояние не восстанавливается.
  • По некоторым техническим причинам мой руководитель проекта отметил, что я не должен использовать состояние сеанса для хранения чего-либо.
  • Другой ПМ посоветовал мне, что элементы управления должны быть восстановлены на странице_иниции. НО, поскольку я храню данные управления в ViewState, это невозможно, потому что viewstate не готов, а мои данные равны нулю.

Может ли кто-нибудь посоветовать о том, как успешно восстановить представление для этих динамически сгенерированных элементов управления. Я пробовал искать все и пробовал кучу решений в Интернете, но ничего, что я пробовал, похоже, работает.

Спасибо!

+0

Любые конкретные причины, по которым вы визуализируете ячейки таблицы HTML и ROWS и столбцы, вместо использования ретрансляторов, таких как Repeater, Datagrid или Gridview. –

+0

Нет, не я, я изменяю существующую страницу и содержимое создается в этом вопросе в других местах, поэтому я думал, что буду следовать за ним. Эти элементы управления выполняются в OnInit, так как они имеют требуемые данные заранее, а я нет, они сохраняют свое состояние. Будет ли использование репитера или Datagrid решить проблему? – SikhWarrior

ответ

1

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

+0

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

+0

Мне нужно иметь возможность восстанавливать выбор пользователя в каждом выпадающем меню, будет ли это решение также делать это, или это то, что мне нужно будет хранить где-нибудь? – SikhWarrior

+0

Это решение также сделает это. Потому что вы будете воссоздавать тот же элемент управления, что и он известен в представлении. Когда postback закончится, viewstate найдет это управление и заставит предыдущее состояние. –