2012-11-24 2 views
2

.aspx 파일에는 일반적인 html 코드와 "Panel1"컨트롤이 있습니다. 우선 "ddl"이라는 드롭 다운 목록을 만들고 여기에 ListItems를 추가합니다.이 모든 것은 코드 뒤에 있습니다. 다음으로 특정 수의 다른 DropDownLists를 만들고 페이지를 실행할 때 "Panel1"컨트롤에 추가해야하는 "ddl"에 추가 된 모든 ListItems를 복사하려고합니다. 가장 중요한 부분은 동적으로 생성 된 모든 드롭 다운리스트가 페이지를 실행할 때 선택된 값을 가지기를 바랍니다.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에 대해 선택한 값이 동일 할 것입니다 그것은 "네"입니다, "2"해야 논리적으로 첫 번째, 두 번째 "당신은 아래의 코드를 볼 수 있습니다 3 "이고 세 번째 값은"4 "가 선택 값이어야합니다. 첫 번째 질문은 : 내가 뭘 잘못하고 있니?

두 번째 질문입니다. ddlDynamic.SelectedValue = j.ToString(); 대신 ddlDynamic.Items.FindByValue(j.ToString()).Selected = true;을 사용할 때 "DropDownList에서 여러 항목을 선택할 수 없습니다."라는 메시지가 나타납니다. 왜 그런가요?

감사합니다.

답변

2

답변을 찾았습니다. 여기서 중요한 것은 ddlDynamic.Items.Add(ddl.Items[i]); 행을 기억하고 "ddl"드롭 다운 목록에서 참조로 항목을 추가하며 "for"루프로 동적으로 만든 각 DropDownLists에 ListItems를 복사하지 않습니다. 동적으로 생성 된 모든 드롭 다운리스트는 "ddl"에 앞서 초기화 된 동일한 ListItem을 사용합니다.

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

같은 일을 할 것입니다 : 그것은 알고하는 것이 중요합니다은 "DDL"에서 참조로 많은 ListItems를 사용합니다. 그래서 내가 찾은 솔루션은 DataTable에있을 것이다이 경우, 각 동적으로 생성 DropDownList로에 대한 많은 ListItems를 만들고, 소스에서 그들을 채울 수 있습니다 :

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를 목록의 "Value"에 추가하는 것이 중요합니다. 목록의 "Text"속성에는 ParentId의 이름이 표시됩니다. 그러나이 문제를 해결하기 위해 2D 배열을 사용하는 것도 논리적입니다. 답변 주셔서 감사합니다. – John