我在使用相同的动态生成的下拉列表及其视图状态时遇到了一些问题。
长话短说,用户将上传一个 excel 文件,该文件将被解析并为适当的数据创建下拉列表。这是在按下 asp 按钮时完成的,并将控件添加到表中,如下所示:
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++;
}
}
但是,在此之后的每次回发时,下拉菜单都会被删除。我在网上寻找解决方案,通常所有内容都指向使用与创建控件时相同的 id 重新创建控件,以便可以从 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 上,控件被重新创建,但它们的状态没有恢复。
- 由于某些技术原因,我的项目经理提到我不应该使用会话状态来存储任何东西。
- 另一位 PM 建议我应该在 page_init 上重新生成控件。但是因为我将控制数据存储在 ViewState 中,所以这是不可能的,因为 viewstate 还没有准备好并且我的数据为空。
任何人都可以建议如何成功恢复这些动态生成的控件的视图状态。我已经尝试过搜索所有内容并在网上尝试了一堆解决方案,但我尝试过的任何方法似乎都不起作用。
谢谢!