2013-09-29 2 views
1

현재 C# 및 asp.net을 사용하는 웹 사이트에서 작업하고 있습니다. 이를 위해 동적 컨트롤을 만들어야하지만 몇 가지 문제가 있습니다. 나는 이미 공식 문서를 읽고 튜토리얼을 많이 찾았지만 불행히도 아무도이 문제를 해결할 수 없었다.동적 인 C# asp.net 컨트롤 문제 해결

다음은 내가 수행하려고 시도하는 매우 단순한 예입니다.

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
     CreateControls(); 
    else 
     UpdatePage(); 
} 

protected void CreateControls() 
{ 
    Button button1 = new Button(); 
    button1.ID = "_Button1"; 
    button1.Text = "Button1"; 
    button1.Click += new System.EventHandler(_ClickEvent); 
    _Panel.Controls.Add(button1); 

    Button button2 = new Button(); 
    button2.ID = "_Button2"; 
    button2.Text = "Button2"; 
    button2.Click += new System.EventHandler(_ClickEvent); 
    _Panel.Controls.Add(button2); 
} 

protected void UpdatePage() 
{ 
    Button button1 = ((Button)_Panel.FindControl("_Button1")); 
    button1.Text = "I went through UpdatePage and changed"; 

    Button button2 = ((Button)_Panel.FindControl("_Button2")); 
    button1.Text = "I went through UpdatePage and changed"; 
} 

protected void _ClickEvent(object sender, EventArgs e) 
{ 

} 

여기서 목표 중 하나를 클릭하면 버튼의 텍스트가 변경됩니다. "Page_Load"메서드는 "UpdatePage"메서드와 마찬가지로 올바르게 호출되지만 후자에서는 Button1 및 Button2 컨트롤이 사라지고 (패널 컨트롤에 더 이상 포함되지 않음) NullPointer 예외가 분명히 제기됩니다.

아무도 설명이 없습니까? 페이지 수명주기에 대해 뭔가 빠뜨린 것 같지만 어디서나 명확한 해결책을 찾을 수 없었습니다.

고맙습니다.

+3

모든 포스트 백마다 동적으로 생성 된 모든 컨트롤을 다시 만들어야합니다. [진정한 다이나믹 컨트롤 이해하기] (http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/Truly-Understanding-Viewstate.aspx) –

+0

영어가 모국어가 아닌 사람에게는 읽기가 어렵지만 정말 완료되었습니다! 불행히도 실제로 컨트롤을 만들고 업데이트하는 Page_Load 메서드를 사용하는 방법에 대한 설명을 찾을 수 없습니다. 나는 관련 단락을 놓쳤습니까? –

답변

0

을하지만, Page_Load 이벤트 페이지에 컨트롤을 추가하고 웹폼을 가지고 너무 늦기이 시도 그거 알아.

OnInit과 Page_Load 사이의 초기 페이지로드에서 WebForms는 현재 페이지에있는 컨트롤을 기록하고 뷰 상태 및 모든 내용을 설정하므로 다음에 게시 할 수 있습니다 다시 말해서 컨트롤이 있어야한다는 것을 알고 있습니다. Page_Load 때까지 컨트롤을 추가하지 않으면 WebForms는 페이지에 추가하는 내용에 더 신경을 쓰지 않으므로 다음에 페이지를 다시 게시하면 해당 컨트롤을 페이지에 배치 할 수 없습니다.

CreateControls 호출을 OnInit 메서드로 이동하십시오. 이렇게하면 적절한 시간에 WebForms에 컨트롤을 만들 수 있습니다. (약간 나중에 .aspx 태그의 컨트롤을 추가하는 것과 거의 같은 시간에). 그런 다음 WebForms는 해당 컨트롤을 인식하고 필요한 모든 뷰 상태 (다시 게시 인 경우)를 적용한 다음 마지막으로 Page_Load에 적용하여 UpdatePage 호출로 컨트롤 데이터를 처리 할 수 ​​있습니다.

protected override void OnInit(EventArgs e) 
{ 
    base.OnInit(e); 
    CreateControls(); 
} 

OnInit은 "모든 컨트롤을 페이지 및 와이어 업 이벤트 핸들러에 넣으십시오"라고 생각하십시오.

Page_Load를 "이미있는 컨트롤에 데이터 넣기"라고 생각하십시오.

0

동적으로 만드는 컨트롤은 다시 게시 할 때 손실됩니다.

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

protected void CreateControls() 
{ 
    Button button1 = new Button(); 
    button1.ID = "_Button1"; 
    button1.Text = "Button1"; 
    button1.Click += new System.EventHandler(_ClickEvent); 
    _Panel.Controls.Add(button1); 

    Button button2 = new Button(); 
    button2.ID = "_Button2"; 
    button2.Text = "Button2"; 
    button2.Click += new System.EventHandler(_ClickEvent); 
    _Panel.Controls.Add(button2); 
} 

protected void UpdatePage() 
{ 
    Button button1 = ((Button)_Panel.FindControl("_Button1")); 
    button1.Text = "I went through UpdatePage and changed"; 

    Button button2 = ((Button)_Panel.FindControl("_Button2")); 
    button1.Text = "I went through UpdatePage and changed"; 
} 

protected void _ClickEvent(object sender, EventArgs e) 
{ 

} 
+0

실제로 작동하지만 "CreateControls"바로 다음에 "UpdatePage"가 호출되기 때문에 버튼 텍스트는 절대로 "Button1"및 "Button2"가 아니지만 직접 "UpdatePage를 거쳐 변경됨"이됩니다. 이렇게하면 "_ClickEvent"이벤트 메서드에서 텍스트를 수정해야합니까? –

0

이 그것을 시도 할 것이다 : 당신은 컨트롤을 페이지가로드를 처음 만드는

protected String TextButton1 
    { 
     get { return (String) ViewState["TextButton1"]; } 
     set { ViewState["TextButton1"] = value; } 
    } 

    protected String TextButton2 
    { 
     get { return (String)ViewState["TextButton2"]; } 
     set { ViewState["TextButton2"] = value; } 
    } 

    protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 
     CreateControls(); 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (IsPostBack) 
     { 
      UpdatePage(); 
     } 
    } 

    protected void CreateControls() 
    { 
     Button button1 = new Button(); 
     button1.ID = "_Button1"; 
     button1.Text = String.IsNullOrEmpty(TextButton1) ? "The First Value" : TextButton1; 
     button1.Click += new System.EventHandler(_ClickEvent1); 
     _Panel.Controls.Add(button1); 

     Button button2 = new Button(); 
     button2.ID = "_Button2"; 
     button2.Text = String.IsNullOrEmpty(TextButton2) ? "The First Value" : TextButton2; 
     button2.Click += new System.EventHandler(_ClickEvent2); 
     _Panel.Controls.Add(button2); 
    } 

    protected void UpdatePage() 
    { 
     Button button1 = ((Button)_Panel.FindControl("_Button1")); 
     button1.Text = String.IsNullOrEmpty(TextButton1) ? "The First Value" : TextButton1; 

     Button button2 = ((Button)_Panel.FindControl("_Button2")); 
     button2.Text = String.IsNullOrEmpty(TextButton2) ? "The First Value" : TextButton2; 
    } 

    protected void _ClickEvent1(object sender, EventArgs e) 
    { 
     TextButton1 = "test"; 
     Button b = (Button) sender ; 
     b.Text = TextButton1; 
    } 

    protected void _ClickEvent2(object sender, EventArgs e) 
    { 
     TextButton2 = "test"; 
     Button b = (Button)sender; 
     b.Text = TextButton2; 
    }