2012-11-24 28 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