动态生成的下拉列表Postback

本文关键字:下拉列表 Postback 动态 | 更新日期: 2023-09-27 18:24:53

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

长话短说,用户将上传一个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还没有准备好,而且我的数据为空

有人能就如何成功恢复这些动态生成的控件的视图状态提出建议吗。我试过搜索所有内容,并在网上尝试了一系列解决方案,但我尝试过的似乎都不起作用。

谢谢!

动态生成的下拉列表Postback

您做得很好,但您必须使用数据源重新创建控件,并重新绑定所有控件。如果不完成此操作,您将创建与以前的控件不匹配的控件。您可以调用第一个方法来执行此操作。