2012-12-17 3 views
0

몇 가지 자습서와 코드 예제를 따르려고했지만 예상대로 작동하지 않습니다.루프의 텍스트 상자 값 저장 (asp.net 웹 페이지)

웹 페이지에 일련의 텍스트 상자가 있고 각각을 반복하여 데이터베이스에 저장해야합니다. 페이지의 텍스트 상자 수는 다양합니다. 데이터베이스에서로드합니다. 그것들은 모두 테이블 객체에 추가됩니다.

TableCell cellb = new TableCell(); 
TextBox txtAnswer = new TextBox(); 
txtAnswer.TextMode = TextBoxMode.MultiLine; 
txtAnswer.Rows = 2; 
txtAnswer.ID = "field_" + dataRow["fieldID"].ToString(); 
txtAnswer.Text = "answer"; //this will be got from the database 

cellb.Controls.Add(txtAnswer); 

그래서 테이블 행에 텍스트 상자를 추가합니다. 내가 다음 코드 따라서 위

foreach (Control c in Page.Controls) 
{ 
    foreach (Control childc in c.Controls) 
    { 
     if (childc is TextBox) 
     { 
      TextBox tmpText = (TextBox)childc; 
      tmpField = tmpText.ID.Split('_'); 
      fieldID = Convert.ToInt32(tmpField[1]); 
      //save value to the database (eventually) 
      debug.InnerHtml += tmpText.Text; //this just outputs the values for now 
     } 
    } 
} 

가있는 저장 버튼이 있어야를 Page_Load에 추가 된 모든 페이지 컨트롤과는 텍스트 필드를 찾을 수 있지만 루프. 그러나, 나는 그것이 존재하지 않기 때문에 그것이 지금 있는지 궁금해하고있다. 따라서 페이지를 저장할 때 컨트롤을 알 수 없습니다. 나는 테이블 컨트롤을 볼 수 있지만 그 안에는 아무 것도 .... 어떤 아이디어?!

답변

1

동적 제어는 각 페이지 요청에 추가되어야합니다. 바람직하게는 Init 이벤트 중에. 컨트롤을 반복 할 때까지는 아직 추가되지 않은 것 같습니다.

또한 특정 컨트롤 내에 TextBox가 있다는 것을 알고 있으면 해당 컨트롤을 먼저 찾은 다음 사용중인 것과 같은 방법을 사용하여 컨트롤을 반복해야합니다. 두 가지 이유는 다음과 같습니다 효율성 및 또한 코드에서 페이지 컨트롤에서 두 수준 아래로 검색하고 있습니다. 이것은 괜찮지 만 텍스트 상자를 포함하지 않는 다른 컨트롤을 포함합니다.

0

왜 Gridview 컨트롤을 사용하지 않고 Texbox로 사용자 지정 템플릿을 만들지 않습니까? 그런 다음 페이지로드시 원하는 Textboxes를 추가 한 다음 gridview를 반복하고 데이터를 저장할 수 있습니다.

0

첫 번째 사항. if (!isPostBack){} 안에 컨트롤을 만들지 않도록하십시오. 다시 게시 할 때마다 다시 만들어야합니다.

두 번째로, 루프가 모든 컨트롤을 찾지 못한다고 생각합니다. 실제로 첫 번째 레벨을 지나갈뿐입니다.

이상적으로는 recursivley 컨트롤을 검색해야합니다.

다음은 내가 사용하는 재귀 적 방법입니다. 이것은 주어진 ID의 모든 컨트롤을 찾는 데 도움이됩니다.

/// <summary> 
    /// Finds a Control recursively. Note finds the first match that exists 
    /// </summary> 
    /// <param name="ContainerCtl">Should be the lowest container in the heirarchy, for eg dont choose Master page if you can pick the specific panel</param> 
    /// <param name="IdToFind">ID of the control you are looking for</param> 
    /// <returns>the control if found else null</returns> 
    public static Control FindControlRecursive(Control Root, string Id) 
    { 
     if (Root.ID == Id) { return Root; } 

     foreach (Control Ctl in Root.Controls) 
     { 
      Control FoundCtl = FindControlRecursive(Ctl, Id); 
      if (FoundCtl != null) { return FoundCtl; } 
     } 
     return null; 
    } 

자, 내가 할 것입니다 것은 :

당신이 '를,의 모든 ID 저장'을 당신의 TextBox을 만들 Array에들

. 그런 다음 액세스해야 할 때 Array을 반복하고 각 항목에 대해 위의 메소드를 호출하십시오. 이렇게하면 TextBox이 필요합니다.