2

.aspx 文件有它通常的 html 代码和一个“Panel1”控件。首先,我正在创建一个名为“ddl”的下拉列表并向其中添加一些 ListItem,所有这些都来自后面的代码。接下来我想创建一定数量的其他 DropDownLists 并将我添加到“ddl”的所有 ListItems 复制到它们,之后我需要在页面运行时将它们添加到“Panel1”控件中。最重要的部分是我希望所有动态创建的下拉列表在运行页面时都有一个选定的值。你可以看到下面的代码:

protected void Page_Load(object sender, EventArgs e)
{
    DropDownList ddl = new DropDownList();
    ddl.Items.Add(new ListItem("One", "1"));
    ddl.Items.Add(new ListItem("Two", "2"));
    ddl.Items.Add(new ListItem("Three", "3"));
    ddl.Items.Add(new ListItem("Four", "4"));
    ddl.Items.Add(new ListItem("Five", "5"));
    ddl.Items.Add(new ListItem("Six", "6"));
    ddl.Items.Add(new ListItem("Seven", "7"));

    int j = 2;
    for (int h = 0; h < 3; h++)
    {
        DropDownList ddlDynamic = new DropDownList();

        //Add the items from ddl to the new dropdownlsit
        for (int i = 0; i < ddl.Items.Count; i++)
        {
            ddlDynamic.Items.Add(ddl.Items[i]);
        }
        //the selected item in the first dropdownlist 
        //must be "Two" but it will be "Four". WHY???
        ddlDynamic.SelectedValue = j.ToString();
        ddlDynamic.ID = h.ToString();
        Panel1.Controls.Add(ddlDynamic);
        Panel1.Controls.Add(new LiteralControl("<br />"));
        j++;
    }
}

这里的问题是所有三个下拉列表的选定值都是相同的,它将是“四”,当逻辑上第一个必须是“二”时,第二个是“三”,第三个必须有“四”作为选定值。第一个问题是:我做错了什么?

第二个问题。当使用ddlDynamic.Items.FindByValue(j.ToString()).Selected = true;而不是ddlDynamic.SelectedValue = j.ToString();我得到“不能在下拉列表中选择多个项目”时。这是为什么?

谢谢你。

4

3 回答 3

2

我找到了答案。这里重要的是要记住这一ddlDynamic.Items.Add(ddl.Items[i]);行,通过引用从“ddl”下拉列表中添加项目,并且不会将 ListItems 复制到使用“for”循环动态创建的每个 DropDownLists 中。所有动态创建的下拉列表都使用之前初始化并添加到“ddl”的相同列表项。重要的是要知道:

ddlDynamic.DataSource = ddl.Items;
        ddlDynamic.DataBind();

将做同样的事情:将通过引用“ddl”来使用 ListItems。所以我找到的解决方案是为每个动态创建的 DropDownList 创建 ListItems,并从源填充它们,在这种情况下它将是一个 DataTable:

protected void Page_Load(object sender, EventArgs e)
{
    DataTable table = new DataTable();
    table.Columns.Add("text", typeof(string));
    table.Columns.Add("value", typeof(string));

    table.Rows.Add("One", "1");
    table.Rows.Add("Two", "2");
    table.Rows.Add("Three", "3");
    table.Rows.Add("Four", "4");
    table.Rows.Add("Five", "5");
    table.Rows.Add("Six", "6");
    table.Rows.Add("Seven", "7");

    int j = 1;
    for (int h = 0; h < 3; h++)
    {
        DropDownList ddlDynamic = new DropDownList();
        foreach (DataRow rw in table.Rows)
        {
            ddlDynamic.Items.Add(new ListItem((string)rw["text"], (string)rw["value"]));
        }

        ddlDynamic.SelectedValue = j.ToString();
        ddlDynamic.ID = h.ToString();
        Panel1.Controls.Add(ddlDynamic);
        Panel1.Controls.Add(new LiteralControl("<br />"));
        j++;
    }
}

如果有人有更好的主意,请告诉我。

于 2012-11-24T22:10:51.600 回答
1

你有正确的答案。我正在玩代码,并认为我会继续发布我所拥有的。

protected void Page_Load(object sender, EventArgs e)
{
    var numListControls = 3;
    for (int i = 0; i < numListControls; i++)
    {
        var newList = new DropDownList() { ID = i.ToString() };
        newList.Items.AddRange(GetListItems(i + 1));
        Panel1.Controls.Add(newList);
        Panel1.Controls.Add(new LiteralControl("<br />"));
    }        
}

string[] values = new[] { "One", "Two", "Three", "Four", "Five", "Six", "Seven" };
public ListItem[] GetListItems(int selectedValue)
{           
    return values.Select((val, pos) => new ListItem() {
        Text=val, 
        Value=(pos + 1).ToString(), 
        Selected = selectedValue == pos
    }).ToArray();
}
于 2012-11-24T22:40:27.013 回答
0

我推荐你阅读这篇文章。它有一点:“很容易假设添加到占位符的所有控件也自动添加到 ViewState。但是情况并非如此”

于 2012-11-24T21:28:48.007 回答