SelectedValue属性并动态创建DropDownLists.ASP.NET



.aspx文件中有它通常的html代码和一个"Panel1"控件。首先,我创建了一个名为"ddl"的dropdownlist,并在其中添加了一些ListItems,所有这些都来自代码背后。接下来,我想创建一定数量的其他DropDownList,并将我添加到"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();时,我会得到一个"不能在DropDownList中选择多个项目。"为什么?

谢谢。

我找到了答案。这里重要的是要记住,ddlDynamic.Items.Add(ddl.Items[i]);行通过引用从"ddl"下拉列表中添加项目,并且不会将ListItems复制到使用"for"循环动态创建的每个下拉列表中。所有动态创建的dropdownlists都使用之前初始化并添加到"ddl"中的the SAME ListItems。重要的是要知道:
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++;
}
}

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

你得到了正确的答案。我在玩代码,我想我会继续发布我所拥有的。

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

我建议您阅读这篇文章。它有一点:"很容易假设所有添加到占位符的控件也会自动添加到ViewState。然而,事实并非如此。">

最新更新