2009-08-11 2 views
1

여기 내 HTML도움을 삽입 FormView 후 패널에 컨트롤 추가

<asp:UpdatePanel runat="server" ID="panel1" UpdateMode="Conditional"> 
     <ContentTemplate> 
      <asp:FormView runat="server" ID="formViewUno" DataSourceID="odsBob" DefaultMode="Insert"> 
            <InsertItemTemplate> 
        <span>Name:</span> 
        <asp:Literal ID="Literal4" runat="server" Text="&nbsp;&nbsp;&nbsp;" /> 
        <asp:TextBox runat="server" ID="tbxName" Text='<%# Bind("Name") %>' /> 
        <br /> 
        <span>Age:</span> 
        <asp:Literal ID="Literal5" runat="server" Text="&nbsp;&nbsp;&nbsp;" /> 
        <asp:TextBox runat="server" ID="tbxAge" Text='<%# Bind("Age") %>' /> 
        <br /> 
        <span>City:</span> 
        <asp:Literal ID="Literal6" runat="server" Text="&nbsp;&nbsp;&nbsp;" /> 
        <asp:TextBox runat="server" ID="tbxCity" Text='<%# Bind("City") %>' /> 
        <br /> 
        <asp:Button ID="Button1" runat="server" CommandName="Insert" Text="Insert" /> 
       </InsertItemTemplate> 
      </asp:FormView> 
       <asp:Panel runat="server" ID="msgs"> 

      </asp:Panel> 
     </ContentTemplate> 
    </asp:UpdatePanel> 

가 여기 내 C#

private void odsBob_Inserted(object sender, ObjectDataSourceStatusEventArgs e) 
    { 

      var p = e.ReturnValue as Person; 
      if (p != null) 
      { 
       var msg = new Label 
           { 
            Text = 
             String.Format("{0} [Age:{1}, City:{2}] was successfully added", p.Name, p.Age, 
                p.City) 
           }; 

       var br = new LiteralControl { Text = "<br/>" }; 
       msgs.Controls.Add(br); 
       msgs.Controls.Add(msg); 


      } 

    } 

이야 어떻게 (삽입 후 새로 추가) 레이블 컨트롤을 지속 할 수 있습니까? 그것은 사라지고 있습니다. 추가 된 새 항목이 매번 올바르게 추가됩니다. 컨트롤 컬렉션을 그대로 유지하려면 어떻게해야합니까? 어떤 도움을 주셔서 감사합니다.

건배, ~ CK 동적 이벤트 핸들러 동안 라벨 개체를 만드는 것 같습니다

답변

1

.

동적 컨트롤은 모든 포스트 백마다 다시 만들어야하기 때문에 문제가 있습니다. 포스트 백이 페이지 객체의 새 인스턴스를 생성한다는 것을 기억하십시오. 즉, 마지막 페이지에 추가 한 컨트롤이 없어 졌기 때문에 Panel은 새 요청마다 비어있는 것으로 초기화되므로 최신 리터럴/레이블 쌍만 추가됩니다.

프리젠 테이션 중에 세션에 필요한 텍스트 정보를 모두 추가하고 Panel에 동적 라벨 및 리터럴을 생성 할 수 있습니다.

다른 해결책은 더 복잡 할 수 있지만 초기화 단계에서 Panel에 레이블과 리터럴을 동적으로 추가하게 할 수 있습니다. Init 중에 동일한 수의 컨트롤이 같은 순서로 추가되도록 할 수 있으면 해당 컨트롤에 대한 ViewState가 각 PostBack에서 올바르게 추적됩니다. 기본적으로 가장 최근에 추가 된 레이블과 리터럴을 Session에 저장하고 Panel이 다음 요청시이를 가져 와서 Init 동안 다시 추가되었는지 확인해야합니다. Panel이 초기화 중에 얼마나 많은 컨트롤 세트를 추가했는지 알 수 있도록 카운터를 저장해야합니다.

+0

objectDatasouce를 사용하고 있습니다. 나는 명시 적으로 어디에서든지 databind를 호출하지 않을 것이다. 내가 있어야 할까? IsPostback 경우에만 바인딩해야합니까? DataSourceId를 사용할 때 databind가 암묵적으로 호출되었다고 생각했습니다. 이 작업을 제대로 수행하도록 지시하십시오. 감사. :) – Hcabnettek

+0

남자는 장님에 대해 이야기합니다. 나는 당신의 코드를 잘못 읽었습니다. 나는 당신을 위해 나의 대답을 업데이트 할 것이다. – womp