У меня проблемы с такими же динамически сгенерированными выпадающими списками и их представлением.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 не готов, а мои данные равны нулю.
Может ли кто-нибудь посоветовать о том, как успешно восстановить представление для этих динамически сгенерированных элементов управления. Я пробовал искать все и пробовал кучу решений в Интернете, но ничего, что я пробовал, похоже, работает.
Спасибо!
Любые конкретные причины, по которым вы визуализируете ячейки таблицы HTML и ROWS и столбцы, вместо использования ретрансляторов, таких как Repeater, Datagrid или Gridview. –
Нет, не я, я изменяю существующую страницу и содержимое создается в этом вопросе в других местах, поэтому я думал, что буду следовать за ним. Эти элементы управления выполняются в OnInit, так как они имеют требуемые данные заранее, а я нет, они сохраняют свое состояние. Будет ли использование репитера или Datagrid решить проблему? – SikhWarrior