4

코드 비하인드에서 드롭 다운 목록을 생성 중이며 selectedindexchanged 이벤트가 자동으로 실행되지 않습니다. ASPX 페이지에 직접 넣을 때 제대로 작동하지만 코드 비하인드에 있어야합니다.ASPX 페이지의 Codebehind 대 ASP.NET 드롭 다운 목록

이 작동하지 않습니다

var deptList = new DropDownList 
    { 
     ID = "deptList", 
     DataSource = departments, 
     DataTextField = "deptname", 
     DataValueField = "deptid", 
     AutoPostBack = true, 
     EnableViewState = true 
    }; 

deptList.SelectedIndexChanged += new EventHandler(deptList_SelectedIndexChanged); 
deptList.DataSource = departments; 
deptList.DataTextField = "deptname"; 
deptList.DataValueField = "deptid"; 

if (!IsPostBack) 
    deptList.DataBind(); 

deptList.Items.Insert(0, new ListItem("---Select Department---", string.Empty)); 

writer.Write("Select a department: "); 
deptList.RenderControl(writer); 

하지만,이 작품 : 당신은 충분히 일찍 페이지에 컨트롤을 추가하지 않으면

<asp:DropDownList ID="deptList" AutoPostBack="true" runat="server" OnSelectedIndexChanged="deptList_SelectedIndexChanged"></asp:DropDownList> 

답변

6

문제가있을 수 있습니다. 컨트롤을 페이지 수명주기의 초기에 추가해야 이벤트가 연결됩니다.

너무 늦은로드 이벤트에서이 작업을 수행하고있을 가능성이 큽니다. Init 이벤트 중 또는 CreateChildControls 메서드를 재정 의하여이를 추가하십시오.

편집 : Dave Swersky가 언급했듯이 포스트 백을 포함하여 모든 페이지 요청에서이 작업을 수행해야합니다.

+0

그래서 HTMLTexWriter로 렌더링 했으므로 Init 또는 Load에서 렌더링 할 수 있습니까? – Alex

+0

전체 코드 블록을 page_init에 넣었지만 아무 일도 일어나지 않습니다. – Alex

+0

Firebug 또는 IE 개발 콘솔에서 작동중인 구현 (마크 업)과 작동하지 않는 (코드) 사이의 마크 업을 비교합니다. 뭔가 달라. –

2

코드에 메쉬가 있습니다. 생성, 데이터 바인딩 및 이벤트 호출을 분리하십시오.

예 :

뒤에 코드에서 다음
<asp:DropDownList ID="deptList" AutoPostBack="true" runat="server"></asp:DropDownList> 

(를 Page_Load) : 당신은 또한 당신이 컨트롤 트리에 컨트롤을 다시 추가 확인해야 : 마이크 무니의 대답에 정교하게

deptList.SelectedIndexChanged += new EventHandler(deptList_SelectedIndexChanged); 

if (!IsPostBack) 
{ 
    deptList.DataTextField = "deptname"; 
    deptList.DataValueField = "deptid"; 
    deptList.DataSource = departments; 
    deptList.DataBind(); 
    deptList.Items.Insert(0, new ListItem("---Select Department---", string.Empty)); 
} 
2

모든 포스트 백마다 컨트롤 트리는 각 포스트 백에서 다시 작성되며 마크 업에서 읽습니다. 프로그래밍 방식으로 한 번 추가 한 적이 없으면 다시 트리에 이벤트를 수신 할 컨트롤이 없습니다.

+0

감사합니다. Dave. 그렇습니다, 나는 매우 중요한 부분을 언급하는 것을 게을리했지만, 포스트 백인지 여부에 관계없이 컨트롤을 항상 만들어야합니다. 그것은 전에도 여러 번 저를 붙잡 았습니다. –

0

컨트롤 컬렉션에 컨트롤을 추가하지 않은 것처럼 보입니다. 컨트롤을 컨트롤 계층의 어딘가에 추가하고 이벤트가 수신되도록 컨트롤이 있는지 확인하기 위해 모든 다시 게시마다 컨트롤을 추가해야합니다. 컨트롤을 추가하면 RenderControl을 직접 호출 할 필요가 없습니다.

0

내가 가진 문제는 드롭 다운 목록에 AutoPostBack = true가 없으면 절대로 함수를 호출하지 않는다는 것입니다.