好的,所以我一直在研究这个......我不知道,5个小时?我正在拉开我的头发开始认为用asp.net是不可能的!啊!我看过各种各样的资源(我甚至尝试过多年前由其他人创建的DynamicControlsPlaceholder - 它失败了)。所以这里的问题是希望有人在这里有解决方案!
我正在尝试创建一个页面,用户可以动态添加DropDownLists,而不会忘记他们在之前列表中设置的值。例如,假设用户被赋予1个DropDownList并选择索引2.下面会有一个“添加”按钮,这将添加另一个DropDownList。但是,在执行此操作时,页面会执行回发,而前一个DropDownList会丢失索引2的值,而是重置为索引0。我无法弄清楚如何在回发之前保存DropDownList的状态。这一点是这样的,当用户完成时,他们可以点击“提交”,其中包含DropDownLists中的所有值。这是我目前拥有的代码(这很重要),它只是重新生成与应有的相同数量的DropDownLists(基于ViewState [“layoutCount”])。当然,我应该能够“恢复”在重新加载页面之前选择的索引...
aspx文件:
<table style="text-align:center; width:60%;">
<asp:Panel ID="layoutAreaPanel" runat="server" CssClass="paragraphStyle" />
</table>
<asp:Button ID="cmdLayout1AddPage" runat="server" OnClick="cmdLayout1AddPage_Click" />
C#:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
CreatePanelInfo();
}
....
protected void CreatePanelInfo()
{
int layoutCount = 0;
if (ViewState["layoutCount"] != null)
layoutCount = (int)(ViewState["layoutCount"]);
for (int i = 0; i < layoutCount; i++)
{
TableRow mainRow = new TableRow();
TableCell labelCell = new TableCell();
TableCell dropDownListCell = new TableCell();
Label cellLabel = new Label();
cellLabel.Text = Language.GetLanguageText("ADDPAGE_PAGE", this.Page);
cellLabel.CssClass = "paragraphStyle";
labelCell.HorizontalAlign = HorizontalAlign.Right;
labelCell.Controls.Add(cellLabel);
DropDownList pnlDropDownList = new DropDownList();
pnlDropDownList.ID = "pnlDropDownList" + (i + 1);
pnlDropDownList.BorderWidth = 1;
pnlDropDownList.Width = new Unit("100%");
FillPageList(ref pnlDropDownList); //adds items to the list
dropDownListCell.Controls.Add(pnlDropDownList);
mainRow.Controls.Add(labelCell);
mainRow.Controls.Add(dropDownListCell);
layoutAreaPanel.Controls.Add(mainRow);
}
ViewState["layoutCount"] = layoutCount + 1;
}
....
protected void cmdLayout1AddPage_Click(object sender, EventArgs e)
{
CreatePanelInfo();
}
希望有足够的信息来得到一个好的答案......:S
答案 0 :(得分:0)
只有当您选择的索引更改时,才会使您的下拉列表进行回发。 在后面的代码中,将选择存储在Session变量中。
public void AddDDL()
{
var tmp = new DropDownList();
tmp.SelectedIndexChanged += ddl_SelectedIndexChanged;
Page.Controls.Add(tmp);
}
protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
{
var ddl = sender as DropDownList;
var lists = Session["dropdownlists"] as Dictionary<DropDownList, int>;
lists[ddl] = ddl.SelectedIndex;
}
最后在回发事件中再次设置选定的索引:
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostback)
{
var lists = Session["dropdownlists"] as Dictionary<DropDownList, int>;
foreach (var item in lists)
item.Key.SelectedIndex = item.Value;
}
else Session["dropdownlists"] = new Dictionary<DropDownList, int>();
}
不推荐回发,因为它不是用户友好的。您应该使用UpdatePanel
。