2012-11-24 27 views
2

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

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++; 
    } 
} 

这里的问题是,所有三个dropdownlists选择的值将是相同的,这将是“四”,当逻辑上首先必须是“二”,第二届“三“,第三必须有”四“作为选定值。第一个问题是:我做错了什么?

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

谢谢。

回答

2

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

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

将做同样的事情:将使用ListItems引用从“ddl”。于是我找到了解决方法是为每一个动态创建的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++; 
    } 
} 

如果有人有更好的想法,请让我知道。

0

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

+0

谢谢你的回答。你指出的文章非常好。但是答案有点不同。 – John

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(); 
} 
+0

是的,你也有一个正确的答案。然而,这段代码用在一个页面中,我在树视图中有很多类别和子类别,当我想编辑它们时,我将它们加载到一个页面中,使得每个类别的名称都与所选的ParentID为该特定类别。因此,由于ParentID依赖于另一个类别的ID,因此将此ParentId添加到列表的“值”是很重要的,而列表的“Text”属性显示ParentId的名称。然而,使用二维数组来解决这个问题也是合乎逻辑的。谢谢您的回答。 – John