2011-01-07 3 views
2

LinkButton을 클릭하여 페이지에 동적 TextBox를 만듭니다.LinkButton의 동적 TextBox를 클릭하십시오.

그러나 그 후에 페이지가 제출되면 동적으로 생성 된 항목을 찾을 수 없으므로 정보를 데이터베이스로 보낼 수 없습니다. 내가 페이지를 제출하고 데이터베이스 아무것도의 값을 삽입하려고하면 내가 항목을 볼 수있는 lbAddTag_Click 방법에

foreach (Control c in tagsPanel.Controls) 
{ 
    if (c is TextBox) 
    { 
     lblError.Text += c.ClientID + " , "; 
    } 
} 

을, 그들은 존재하지만 .. :

protected void lbAddTag_Click(object sender, EventArgs e) 
{ 
    for (int i = 0; i < 3;i++) 
    { 
     CreateTextBox("txtTag-" + i.ToString()); 
    } 

} 

private void CreateTextBox(string ID) 
{ 
    TextBox txt = new TextBox(); 
    txt.ID = ID; 
    txt.Width = Unit.Pixel(300); 
    //txt.TextChanged += new EventHandler(OnTextChanged); 
    txt.AutoPostBack = false; 
    tagsPanel.Controls.Add(txt); 

    Literal lt = new Literal(); 
    lt.Text = "<br /><br />"; 
    tagsPanel.Controls.Add(lt); 
} 

나는 넣으면

모든 힌트를 크게 환영합니다.

답변

1

컨트롤을 동적으로 만들면 제출시 제어 계층 구조/뷰 상태에 유지되지 않습니다.

확인이 문서 : http://www.4guysfromrolla.com/articles/092904-1.aspx

차라리 리피터 컨트롤이 다음 세션에서의 ArrayList를 유지하고 데이터 소스로 제어를 리피터 것을 사용합니다. 행을 추가하려면 세션의 ArrayList에 행을 추가하고 리피터 컨트롤을 리 바인드합니다. 예가 필요한 경우 알려주세요.

+0

덕분에 cybermate, 난 지금은 이해합니다. 예를들 수 있다면 좋을 것입니다. 나는 지금 4guysfromrolla 포스트를 읽고있다. –

+0

나는 pastebin에 원유 샘플을 올렸다. 다음 URL을 확인하십시오. http://pastebin.com/dwqHDTUC – Chandu

+0

감사합니다. 이것을 시도 할 것입니다 –

1

페이지 수명주기 문제는 ASP.NET에서 매우 까다로운 작업입니다. 라이프 사이클이 뷰 상태로로드되기 전에 LinkButton이 동일한 방식으로 생성되도록해야합니다. 가장 좋은 방법은 컨트롤/페이지를 설정하여 ViewState를 저장할 때 먼저 작성한 텍스트 상자에 대한 정보를 ViewState에 추가하도록하는 것입니다. 그런 다음 ViewState를로드 한 직후 해당 정보를 기반으로 텍스트 상자를 만듭니다. SaveViewState 및 LoadViewState 메서드를 재정 의하여이 작업을 수행 할 수 있습니다.

1

포스트 백에서 모든 동적 컨트롤을 다시 만들어야합니다. 그렇지 않으면 해당 값을 ViewState에서 다시 작성할 수 없습니다. 따라서 텍스트 상자 수 (예 : ViewState 변수)를 저장해야합니다. ID와 동일한 접미사를 사용해야하므로 동일한 ID를 가져야합니다 (예 : TextBox_4).

1

컨트롤 컬렉션은 트리 구조입니다. 컨트롤에는 다른 컨트롤이 포함되어 있으므로 여러 다른 패널이 포함 된 Panel 컨트롤과 찾고있는 TextBox가 포함 된 Panel 컨트롤이있을 수 있습니다. 재귀 적으로 컨트롤을 통과해야합니다. 이 http://msdn.microsoft.com/en-us/library/486wc64h.aspx

또는 이것

봐 :

public delegate void control_visitor(Control control); 

public void iterate_controls(ControlCollection controls, control_visitor visitor) 
{ 
    foreach (Control control in controls) 
    { 
     visitor(control); 
     iterate_controls(control.Controls, visitor); 
    } 
} 
+0

안녕 Zac. 내 문제는 컨트롤을 반복하는 것과 관련이 없습니다. 나는 이것이 어떻게 행해졌는지 이해하고 그것을했다. 문제는 내가 페이지를 제출 한 후 컨트롤이 viewstate에 유지되지 않는다는 것입니다. 감사합니다 알렉스 –

관련 문제