动态添加下拉列表而不会丢失数据

时间:2015-07-05 06:41:39

标签: c# asp.net

好的,所以我一直在研究这个......我不知道,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

1 个答案:

答案 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