SelectedValue属性和动态创建的DropDownLists。 ASP.NET

时间:2012-11-24 20:54:48

标签: asp.net drop-down-menu

.aspx文件中包含通常的html代码和“Panel1”控件。 首先,我正在创建一个名为“ddl”的下拉列表,并添加一些ListItems,所有这些都来自后面的代码。接下来我想创建一定数量的其他DropDownLists并将其添加到“ddl”的所有ListItem复制到它们之后,我需要在页面运行时将它们添加到“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();时,我会收到“无法在DropDownList中选择多个项目”。那是为什么?

谢谢。

3 个答案:

答案 0 :(得分:2)

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

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

将执行相同的操作:将通过“ddl”引用使用ListItems。所以我找到的解决方案是为每个动态创建的DropDownList创建ListItem,并从源填充它们,在这种情况下它将是一个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++;
    }
}

如果有人有更好的想法,请告诉我。

答案 1 :(得分: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();
}

答案 2 :(得分:0)

我建议你阅读this article。它有一个观点:“很容易假设添加到占位符的所有控件也会自动添加到ViewState中。但事实并非如此”