2009-11-16 3 views
0

ItemDataBound 이벤트에 컨트롤을 추가하는 listview가 있습니다. 다시 게시가 발생하면 새 컨트롤을 찾을 수 없습니다. 약간의 연구 끝에 ASP .NET은 포스트 백 후에도 항상 이러한 컨트롤이 필요하다는 것을 알게되었습니다. 거기에서 if (!Page.IsPostBack) 외부의 ListView를 바인딩하는 함수를 옮겼습니다. 이제 동적 컨트롤 값을 얻었지만 정적 컨트롤은 기본값으로 설정됩니다. 다음은 내가 성취하고자하는 것을 보여주는 샘플입니다.포스트 백 후에 동적 컨트롤의 값을 얻으려면 어떻게해야합니까?

간결함을 위해이 예제에서 몇 가지 명백한 것을 남겼습니다. 여기

<asp:ListView runat="server" ID="MyList" OnItemDataBound="MyList_ItemDataBound"> 
    <LayoutTemplate> 
     <asp:PlaceHolder runat="server" ID="itemPlaceholder" /> 
    </LayoutTemplate> 

    <ItemTemplate> 
     <asp:PlaceHolder runat="server" ID="ProductPlaceHolder"> 
      <asp:TextBox runat="server" ID="StaticField" Text="DefaultText" /> 
      <asp:PlaceHolder ID="DynamicItems" runat="server" /> 
     </asp:PlaceHolder>   
    </ItemTemplate> 
</asp:ListView> 

는 코드 숨김입니다 :

protected void MyList_ItemDataBound(object sender, System.Web.UI.WebControls.ListViewItemEventArgs e) { 
    PlaceHolder DynamicItems = (PlaceHolder)e.Item.FindControl("DynamicItems"); 
    DynamicItems.Controls.Add(textbox); 
} 

그래서, 내가 말했듯이, 만약 내가 유일한 데이터 바인딩 Page != PostBack 후 나는 다시 게시 내 동적 컨트롤을 찾을 수 없습니다 때. 페이지가로드 될 때마다 바인딩하면 정적 필드가 기본 텍스트로 설정됩니다.

+0

찾기 제어 기능을 사용해 보셨습니까? – Luke101

답변

2

ListView의 데이터 바인딩을 OnInit() 이벤트로 이동해보십시오.

+0

와우, 완벽하게 작동했습니다. 이것에 대한 이유를 설명해 주시겠습니까? 왜 그냥 page_init 그것을 이동 이해가 안 돼요. –

0

Very similar question (ListView를 채우는 대신 사람이 단추 집합을 생성합니다). 간단히 말해, Viestate의 목록에 항목을 저장해야한다는 것을 알게 될 것입니다. Postback에서 그 항목을 꺼내어 목록을 다시 채우는 것보다 낫지 요.

이 솔루션은 데이터 바인딩 (다른 이유로 원치 않을 수도 있음)을 삭제한다는 것을 의미합니다.

희망이 있습니다.

+0

예, 컨트롤은 listview databinds가 만들어 질 때 만들어집니다. 포스트 백 후에리스트 뷰를 바인딩하면 동적 컨트롤을 얻을 수 있지만 정적 컨트롤은 기본값으로 설정됩니다. –

+0

데이터 바인딩을 모두 삭제할 것을 제안합니다. 제 답변에서 분명하지 않지만 잠시 후에 수정하겠습니다. 데이터 소스가 있으면 쉽게 반복하여 컨트롤을 만들 수 있습니다. – JohnIdol

관련 문제