2013-07-03 5 views
2

탐색 막대와 프로그래밍 방식으로로드 된 일부 사용자 정의 컨트롤 (ascx)을 사용하여 간단한 웹 페이지를 만들려고합니다. 모든 컨트롤은 업데이트 패널 안에 있습니다. 나는 다음과 같은 일을 할 (탐색 모음에서) 링크 버튼을 클릭하면 프로그래밍 방식으로로드 된 usercontrols에 대한 ViewState (Page_Load 이후에 복원 됨)

는 :

  1. 내가 viewstate가를 사용하여 현재 UserControl을 저장합니다.
  2. 현재 사용자 컨트롤을 다시로드합니다.

내 'page_load'는 항상 현재 컨트롤을 다시로드합니다.

항상 프로그래밍 방식으로로드 된 컨트롤에 동일한 ID를 할당하면 usercontrol viewstate를 저장할 수 있습니다. 그럼 모든 것이 하나의 작은 점을 제외하면 좋아 보입니다. usercontrol에서 viewcontent가 사용 가능하지 않습니다. Page_Load!

(* 여기)를보십시오. 'txtTest.Text'값은 항상 "0"입니다 (또한 다시 게시하는 동안).

(usercontrol) Page_Load 후에 사용자 컨트롤 viewstate가 복원 된 것처럼 보입니다. 어떻게 가능합니까?

--- "Default.aspx를"---

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:ScriptManager ID="sm" runat="server"> 
     </asp:ScriptManager> 
     <asp:UpdatePanel ID="pnlMain" runat="server"> 
      <ContentTemplate> 
       <div class="links"> 
        <asp:LinkButton ID="lnkButton1" runat="server" OnClick="lnkButton1_Click" Text="Link 1"></asp:LinkButton> 
        <asp:LinkButton ID="lnkButton2" runat="server" OnClick="lnkButton2_Click" Text="Link 2"></asp:LinkButton> 
       </div> 
       <br /> 
       <asp:Panel ID="pnlCtrl" runat="server"></asp:Panel> 
      </ContentTemplate> 
     </asp:UpdatePanel> 
    </div> 
    </form> 
</body> 
</html> 

--- "하여 default.aspx.cs"---

private string CtrlAscx 
{ 
    get 
    { 
     if (ViewState["CtrlAscx"] == null) 
     { 
      ViewState["CtrlAscx"] = String.Empty; 
     } 

     return ViewState["CtrlAscx"].ToString(); 
    } 
    set 
    { 
     ViewState["CtrlAscx"] = value; 
    } 
} 

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

private void loadMyControl() 
{ 
    if (!String.IsNullOrEmpty(CtrlAscx)) 
    { 
     pnlCtrl.Controls.Clear(); 
     Control c = LoadControl(CtrlAscx); 
     c.ID = CtrlAscx + "ID";   // this line is mandatory in order to mantain the usercontrol viewstate 
     pnlCtrl.Controls.Add(c); 
    } 
} 

protected void lnkButton1_Click(Object sender, EventArgs e) 
{ 
    CtrlAscx = "Control1.ascx"; 
    loadMyControl(); 
} 

protected void lnkButton2_Click(Object sender, EventArgs e) 
{ 
    CtrlAscx = "Control2.ascx"; 
    loadMyControl(); 
} 

- "CONTROL1.ASCX "-

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Control1.ascx.cs" Inherits="WebTest.Control1" %> 
Control1: <asp:TextBox id="txtTest" runat="server" Text="0"></asp:TextBox> 
<asp:Button ID="btnTest" runat="server" /> 

-"CONTROL1.ASCX.CS "-

public partial class Control1 : System.Web.UI.UserControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (txtTest.Text == "0")  // * HERE 
     { 
      txtTest.Text = "1"; 
     } 
    } 
} 
012 그것을 만들 때 3,516,

답변

2

이 기사는 내 생명의 은인 'DynamicallyCreatedControls.zip'파일과 'Scenario 3'파일이 있습니다.