0

I가의 default.aspx에있는 자리에 ASCX 사용자 지정 UserControl을로드/추가하여 된 UpdatePanel 내용을 갱신 다음과 같은 기능 :사용자 지정 UserControl을 함량은 버튼을 클릭 포스트 백에 사라

protected void NavigationTab_Click(string ascxpath) 
       {   
         Control ctrl = LoadControl(ascxpath); 
         //cphmaincontent is my asp ContenPlaceHoderId in masterpage 
         PlaceHolder phmaincontent = (PlaceHolder)cphmaincontent.FindControl("phmaincontent"); 
         phmaincontent.Controls.Clear(); 
         phmaincontent.Controls.Add(ctrl); 
         upmaincontent.Update();    
       } 

Masterpage UpdatePanel : 나는 각에 동적으로로드하는 다른 사용자 정의 ASCX 컨트롤, 내 Ctrl 키를 제어 객체 내 탐색 컨트롤에서 NavigationTab_Click를 호출하고

<asp:UpdatePanel ID="upmaincontent" runat="server" UpdateMode="Conditional"> 
        <ContentTemplate> 
         <asp:Label ID="lbmsg" runat="server" Text=""></asp:Label> 
         <asp:ContentPlaceHolder ID="cphmaincontent" runat="server">      
         </asp:ContentPlaceHolder>       
        </ContentTemplate> 
       </asp:UpdatePanel>    

버튼 및 레이블이 단추를 클릭하면 레이블에 일부 텍스트 만 재 지정됩니다.

와 난 그냥 ASCX 제어 경로를 얻기 위해 내 masterpage에이 다음과 같은 코드가 있습니다 :

protected override void OnInit(EventArgs e) 
     {   
       //raising an event to set ascx path 
       mainmenu.NavigatePath += new usercontrols.mainmenu.NavigationHandler(NavigationTab_Click); 

       base.OnInit(e);   
     } 
지금까지 모든 것이 잘 작동

이 NavigationTab_Click 함수를 호출하여 내 Ctrl 키 객체를로드 한 후 나는 자리에서 내 Ctrl 키를 참조 버튼과 라벨이 있지만이 버튼을 클릭하면 라벨을 텍스트로 재 지정해야하지만 대신 전체 Ctrl 컨트롤의 내용이 사라집니다. 제발 도와주세요.

답변

0

컨트롤을 동적으로 추가 할 때는 모든 포스트 백마다 다시 만들어야합니다. 이전과 동일한 ID를 할당해야합니다. 그렇지 않으면 이벤트가 올바르게 트리거되지 않고 값을 ViewState에서 다시로드 할 수 없습니다. 가장 늦은 시점에 Page_Load해야합니다 (Page_Init에서 더 좋습니다).

가능한 경우 언제든지 동적 컨트롤을 피해야하는 이유가 여기에 있습니다.

따라서 이벤트 핸들러에서 컨트롤을 추가 할 수 있습니다. 그러나 그들은 다음 포스트 백에서 다시 만들어야합니다. 그래서 당신은 어딘가에 (ID) 또는 얼마나 많은 컨트롤이 이미 생성되었는지를 저장해야합니다. 예를 들어 ViewState 또는 Session에서이를 수행 할 수 있습니다. 그런 다음 컨트롤에 적절한 ID를 지정할 수 있습니다 (예 : 색인 또는 ID 접미어 포함). 여기

는이 주제에 대한 몇 가지 추가 정보입니다

+0

내 클래스가 직렬화 후 나는 각 컨트롤의 ViewState를 만들 필요가 있다고 생각 해달라고 할 경우 클래스 객체를 저장 한 다음 다시 캐스팅하고 컨트롤에 할당합니다. –

+0

또한이 "ViewState ["ASCXPATH "] = ascxpath;"추가했습니다. ViewState [ "ASCXPATH"]! = null 인 경우 Page_Load()를 체크 한 다음 동일한 함수를 다시 호출 "NavigationTab_Click (ViewState ["ASCXPATH "]. ToString())) " 하지만 여전히 그것을로드 할 수 없기 때문에 ViewState ["ASCXPATH "] 여전히 null이 아니었다 고 생각했기 때문에 그것을 디버깅했기 때문에! –

+0

@NazoTajrian : 컨트롤 인스턴스를 ViewState에 저장하지 말고 정보를 올바르게 다시 만들면됩니다. 사실 나는 왜 당신이 'Visible' 속성을 바꾸지 않고 페이지에 동적으로 추가하는지 그 이유를 밝히지 않았습니다. 고정 번호의 NavigationTabs가 있습니까? 당신이 yes로 대답 할 수 있다면, UserControl을 동적으로 추가하지 마십시오. –

관련 문제