2012-10-09 3 views
-1

나는 이것에 대한 몇 가지 다른 예를 읽었으며 asp.net 페이지 수명주기를 완전히 이해하지 못하는 사람들에게는 분명한 초보자 용 질문 인 것 같습니다. . 고치려는 내 시도가 하나도 빠져 나가지 않았습니다.코드에서 dropdownlist의 값이 잘못됨

영문 :

... 
<% 
for(int j = 0; j < 11; j++) 
{ 
    ChildWeightPounds.Items.Add(new ListItem(j.ToString(),j.ToString())); 
} 
%> 
<asp:DropDownList ID="ChildWeightPounds" runat="server" OnSelectedIndexChanged="DropDownListSelected"> 
    <asp:ListItem Value="">-Select-</asp:ListItem> 
</asp:DropDownList> 
... 
<asp:Button ID="InsertButton" runat="server" Text="Submit" OnClick="InsertButton_Click" /> 

aspx.cs는 :

protected void InsertButton_Click(object sender, EventArgs e) 
{ 
    foreach (Control c in NewPatientForm.Controls) 
    { 
     .... 
     if (c is TextBox) 
     { 
      TextBox tb = (TextBox)c; 
      //Expected response: 
      Response.Write("field: " + tb.ID + " = " + tb.Text + "<br />"); 
     } 
     if (c is DropDownList) 
     { 
      DropDownList ddl = (DropDownList)c; 

      //Unexpected response: 
      //this is not giving me my selected value, but only the top item ("--select--") 
      Response.Write("field: " + ddl.ID + ", selectedItem: " + ddl.SelectedItem.Value + "<br />"); 
     } 
    } 
} 

그것은이 페이지 수명주기에 대한 이해의 나의 부족과 IsPostBack을, 데이터 바인딩() 문제를 매우 분명하다입니다. 하지만, 모든 컨트롤을 반복하고, 텍스트 박스, 체크 박스, 체크 박스리스트가 모두 정상적으로 작동하고, 필드에서 값을 제공한다는 점이 이해가되지 않습니다. 드롭 다운리스트가 내게 값을주지 않는 이유가 있습니다.

OnSelectedIndexChanged 이벤트를 사용해 보았습니다. DataBind() 함수를 사용해 보았습니다.하지만 이것들을 가지고 놀아 보았지만 여전히 값을 얻지 못했습니다.

답변

1

귀하의 예제의 가장 큰 문제 뒤에 OnSelecIndexChanged event

<asp:DropDownList ID="ChildWeightPounds" runat="server" 
     OnSelectedIndexChanged="DropDownListSelected" AutoPostBack="true> 
     <asp:ListItem Value="">-Select-</asp:ListItem> 
    </asp:DropDownList> 

코드를 정의 할 수 있습니다. 이것은 asp.net에 대해서는 권장되지 않습니다. 이것은 여러 가지 이유로 .NET에서 잘 작동하지 않는 기존/고전 ASP 접근 방식입니다.

마크 업 파일에서 dropdownlist에 .cs 파일로 항목을 추가하는 코드를 이동하고 OnPreRender 이전에 발생하는 페이지 이벤트에 연결해야합니다. 이것이 바로 페이지 컨트롤을 변경하고 viewstate/lifecycle을 올바르게 작동시키는 마지막 지점입니다.

protected void Page_Load(object sender, EventArgs e) 
{ 
    for(int j = 0; j < 11; j++) 
    { 
     ChildWeightPounds.Items.Add(new ListItem(j.ToString(),j.ToString())); 
    } 
} 

이 값이 lifecycle에서 잘못된 시간에 dropdownlist에 삽입되고 있다는 귀하의 예제를 실행하지 않고 가능성, 그리고 그 때문에 그렇지 않은 뒤에 당신은 코드에서 선택한 값에 액세스하려고 할 때 작업.

당신을 도울 수있는 asp.net lifecycle에 관한 다음 기사를 고려해보십시오.

+0

골드! 이거 야. 감사! 불행히도 .cs 파일에 for 루프를 넣는 것은 매우 깨끗해 보이지 않습니다. e.i. 나는 필드 (textfields, checkboxes, dropdowsn, 등)의 무리를 가지고 있으며 각각은 .aspx 파일에 만들어져 표시된다. 일부 DropDownLists에는 멋진 반복 패턴이 포함되어 있으므로 <% for()...%>을 사용하여 항목을 인라인으로 추가하는 것이 좋습니다. 코드 뒤에서 DropDownLists 항목을 작성하면 임의로 나타납니다. 이 일을 할 수있는 깨끗한 방법이 있습니까? 그것은 또한 제가 기대하는 가치를 제공합니다. 다시 한 번 감사드립니다! – russds

+0

@russds 도움이 된 것을 기쁘게 생각합니다. asp.net에서 코드 및 마크 업 분리라는 개념이 마음에 들지 않으면 오르막 전투에 들어간 것입니다. 그것은 기본적으로 설립 원칙 중 하나입니다. ASP 배경에서 나온 경우 어떻게 '다르게'보일 수 있지만 둘 다 내 경험으로는 개념이 분리로 더 잘 작동한다는 것은 의문의 여지가 없습니다.하나의 파일이 페이지의 내용을 정의하고, 다른 하나는 작동 방법을 정의하는 것으로 생각하십시오. –

+0

@russds 마크 업과 함께 기능을 정의하려는 경우 ASP.NET MVC (모델 뷰 컨트롤러)를 살펴볼 수 있습니다. 자신의 스타일에 더 잘 어울릴 수 있습니다. –

0

당신은 당신의 DropDownList로에 AutoPostBack="true"을 조정하고 <% %>로 페이지 내에서 인라인 C#을 사용하는되어

void DropDownListSelected(Object sender, EventArgs e) 
{ 
var value = ChildWeightPounds.SelectedValue; 
} 
+0

사실, AutoPostBack = "true"를 드롭 다운에 추가하는 것을 선호하지 않습니다.이 방법은 페이지를 새로 고칩니다 (적어도 필자의 이해를 바탕으로). 그리고 필자는 필드 목록이 길고 사용자가 다시 아래로 스크롤하여 양식에 있던 장소를 검색하십시오. – russds

+0

russds를 도와 드리겠습니다. –

관련 문제