2012-11-05 1 views
0

사용자가 버튼을 클릭 할 때마다 동적으로 만들려는 간단한 사용자 컨트롤이 있습니다 (버튼은 또한 데이터를 db에 저장합니다). 이것은 토론 포럼의 일종으로 사용자가 답장하고 메시지 아래에 표시됩니다.동적으로 페이지에 사용자 정의 컨트롤을 추가합니다. 사용자 컨트롤 (사용자 컨트롤의 ModalPopExtender)에있는 버튼을 클릭하십시오.

사용자가 [답장] 버튼을 클릭하면 ModalPopupExtender 창이 나타나고 사용자가 답장을 입력하고 제출합니다.

팝업에서 submit을 클릭하면 db에 저장되지만 OnInit은 ButtonClick 전에 실행됩니다. 새 컨트롤을 만들고이 시나리오에서 컨트롤을 추가하는 방법입니다.

enter image description here

enter image description here

제어 코드 ASPX

<div style="border: .25em solid #000; margin: 10px; padding: 10px"> 
    <div> 
     <asp:Label ID="lblMessage" runat="server" Width="200px"></asp:Label> 
    </div> 
    <div> 
     <asp:Button ID="btnReply" runat="server" Text="Reply" /> 
    </div> 
</div> 
<table> 
    <tr> 
     <td> 
      <asp:ModalPopupExtender ID="mpeReply" runat="server" TargetControlID="btnReply" PopupControlID="pnlReply" 
       BackgroundCssClass="ModalPopupBG1"> 
      </asp:ModalPopupExtender> 
      <asp:Panel ID="pnlReply" runat="server"> 
       <div class="popupbody"> 
        <table width="90%"> 
         <tr> 
          <td> 
           <asp:TextBox ID="txtReply" runat="server" Width="400px" CssClass="input1" TextMode="MultiLine" 
            ValidationGroup="ReplyPopup"></asp:TextBox> 
          </td> 
         </tr> 
         <tr> 
          <td colspan="2"> 
           <asp:Button ID="btnSubmit" runat="server" Text="Submit" ValidationGroup="ReplyPopup" 
            OnClick="btnSubmit_Click" /> 
           <asp:Button ID="btnClose" runat="server" Text="Cancel" CausesValidation="false" /> 
          </td> 
         </tr> 
        </table> 
       </div> 
      </asp:Panel> 
     </td> 
    </tr> 
</table> 

사용자 제어 .cs

protected void btnSubmit_Click(object sender, EventArgs e) 
{ 
    message.Save(); 
} 

페이지 .cs

을 (버튼 클릭은 DB에 메시지를 저장)
protected void Page_Init(object sender, EventArgs e) 
{ 
    LoadControl(); 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
} 

private void LoadControl() 
{ 
    divMessageControl.Controls.Clear(); 

    MessageCollection msgs = MessageCollection.LoadAll(); 
    foreach (Message msg in msgs) 
    { 
     AddControlInPlaceHolder(msg); 
    } 
} 

private void AddControlInPlaceHolder(Message msg) 
{ 
    Control myUserControl = (Control)Page.LoadControl("~/Controls/MessageControl.ascx"); 

    Label lblMessage = myUserControl.FindControl("lblMessage") as Label; 
    if (lblMessage != null) 
    { 
     lblMessage.Text = msg.MsgTxt; 
    } 

    divMessageControl.Controls.Add(myUserControl); 
} 

답변

1

동적으로 추가 된 컨트롤을 사용하는 경우 Page_Init 처리기에서 이전에 추가 한 모든 컨트롤을 다시 만들어야합니다. 하지만 새로운 컨트롤을 위해서는 그냥 포스트 백 컨트롤 이벤트 처리기에 추가하는 것이 좋습니다. AddControlInPlaceHolder 메서드를 btnSubmit 클릭 핸들러로 호출 해보십시오. 해당 메소드에서 데이터베이스 메시지의 ID를 가져야하는 경우 Save 메소드의 메시지 ID를 새 값으로 업데이트하는 것을 고려하십시오.

1

page_load에서 컨트롤을 다시 만들어야합니다. 완료 예 :

public partial class _Default : Page 
{ 
    public int n; 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (ViewState["Controls"] != null) 
      n = (int)ViewState["Controls"]; 
     if (!Page.IsPostBack) 
      n = 0; 
     for (int i = 0; i <= n; i++) 
     { 
      TestUserControl uc = LoadControl("~/TestUserControl.ascx") as TestUserControl; 
      uc.ID = "TestControl" + i.ToString(); 
      PlaceHolder1.Controls.Add(uc); 
     } 

    } 

    protected void Button1_Click(object sender, EventArgs e) 
    { 
     TestUserControl uc = LoadControl("~/TestUserControl.ascx") as TestUserControl; 
     uc.ID = "TestControl" + n++.ToString(); 
     PlaceHolder1.Controls.Add(uc); 
     ViewState["Controls"] = n; 
    } 
}