动态生成的下拉回发

时间:2013-07-25 17:53:37

标签: c# asp.net postback viewstate html-select

我在使用相同的动态生成的下拉列表及其视图状态时遇到了一些问题。

长话短说,用户将上传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没有准备就绪,我的数据为空。

任何人都可以建议如何成功恢复这些动态生成的控件的视图状态。我已经尝试过搜索所有内容并在线尝试了一系列解决方案,但我尝试过的任何内容似乎都无法正常工作。

谢谢!

1 个答案:

答案 0 :(得分:1)

您做得对,但您必须使用数据源重新创建控件并再次重新绑定所有控件。如果没有这样做,您将创建与之前不匹配的控件。你可以调用你的第一种方法来做到这一点。