2013-01-09 4 views
5

사이의 숨김ASP.NET 동적으로 생성 TableRows가 영문 포스트 백

<asp:Table ID="superTable" runat="server" Width="100%"> 
    <%--populate me on the fly!--%> 
</asp:Table> 

<asp:Button ID="btnAddRow" runat="server" CausesValidation="false" Text="Add Row" onclick="btnAddRow_Click" Width="90%"/> 

<asp:Button ID="btnRemoveRow" runat="server" CausesValidation="false" Text="Remove Last Row" onclick="btnRemoveRow_Click" Width="90%"/> 

<asp:Button ID="btnSubmit" runat="server" Text="1" onclick="btnSubmit_Click" Width="90%"/> 

관련 비트를 유지하지 않을 것이다

protected void Page_Load(object sender, EventArgs e) 
    {if (!IsPostBack){ writeHeader(); makeMeARow(); }} 

protected void btnAddRow_Click(object sender, EventArgs e) 
{ 
    if (int.Parse(btnSubmit.Text) <= 20) 
    { int b = superTable.Rows.Count+1; 

     writeHeader(); 
     btnSubmit.Text = (int.Parse(btnSubmit.Text) + 1).ToString(); 

     for (int a = 1; a <= int.Parse(btnSubmit.Text); a++) 
      { makeMeARow(); } 
    } 
    else{/*tell user they can't do that! Max of 20 rows as noted by form requirements */} 
} 

private void writeHeader() 
{ 
    //= == create row == =// 
    TableHeaderRow tempHeaderRow = new TableHeaderRow();//make row 

    //= == create cells == =// 
    TableHeaderCell tempHeaderCell01 = new TableHeaderCell(); 
    TableHeaderCell tempHeaderCell02 = new TableHeaderCell(); 
    TableHeaderCell tempHeaderCell03 = new TableHeaderCell(); 

    tempHeaderCell01.Text = "Call Number"; tempHeaderCell01.Width = Unit.Percentage(33); 
    tempHeaderCell02.Text = "Author";  tempHeaderCell02.Width = Unit.Percentage(33); 
    tempHeaderCell03.Text = "Title";  tempHeaderCell03.Width = Unit.Percentage(33); 

    //= == add TableCells to TableRow == =// 
    tempHeaderRow.Cells.Add(tempHeaderCell01); 
    tempHeaderRow.Cells.Add(tempHeaderCell02); 
    tempHeaderRow.Cells.Add(tempHeaderCell03); 

    //superTable.Rows.AddAt(superTable.Rows.Count, tempRow); 
    superTable.Rows.Add(tempHeaderRow); 
} 

protected void btnRemoveRow_Click(object sender, EventArgs e) 
{ int b = superTable.Rows.Count - 1; 

    writeHeader(); 
    btnSubmit.Text = (int.Parse(btnSubmit.Text) - 1).ToString(); 
    for (int a = 1; a <= int.Parse(btnSubmit.Text); a++) 
    {makeMeARow();} 
} 
private void makeMeARow() 
{ 
    //= == maybe off by one? == =// 
    string rowCount = superTable.Rows.Count.ToString("00"); 

    //= == create row == =// 
    TableRow tempRow = new TableRow();//make row 

    //= == create cells == =// 
    TableCell tempCell01 = new TableCell(); 
    TableCell tempCell02 = new TableCell(); 
    TableCell tempCell03 = new TableCell(); 

    //= == create TextBoxes == =// 
    TextBox tempTextBox01 = new TextBox(); 
    TextBox tempTextBox02 = new TextBox(); 
    TextBox tempTextBox03 = new TextBox(); 

    //= == change the ID of TableRow == =// 
    tempRow.ID = "tableRow_" + rowCount; 

    //= == change the IDs of TableCells == =// 
    tempCell01.ID = "tableCell_" + rowCount + "_01"; 
    tempCell02.ID = "tableCell_" + rowCount + "_02"; 
    tempCell03.ID = "tableCell_" + rowCount + "_03"; 

    //= == change the IDs of TextBoxes == =// 
    tempTextBox01.ID = "txtCallNumber_" + rowCount; 
    tempTextBox02.ID = "txtAuthor_" + rowCount; 
    tempTextBox03.ID = "txtTitle_" + rowCount; 

    //= == change TextBox widths to 90%; 
    tempTextBox01.Width = Unit.Percentage(90); 
    tempTextBox02.Width = Unit.Percentage(90); 
    tempTextBox03.Width = Unit.Percentage(90); 

    //= == add TextBoxes to TableCells == =// 
    tempCell01.Controls.Add(tempTextBox01); 
    tempCell02.Controls.Add(tempTextBox02); 
    tempCell03.Controls.Add(tempTextBox03); 

    //= == add TableCells to TableRow == =// 
    tempRow.Cells.Add(tempCell01); 
    tempRow.Cells.Add(tempCell02); 
    tempRow.Cells.Add(tempCell03); 

    //add TableRow to superTable 
    //superTable.Rows.AddAt(superTable.Rows.Count, tempRow); 
    superTable.Rows.Add(tempRow); 
} 

좋아, 내 문제; - "행 추가"또는 "행 제거"버튼을 누르면 셀의 데이터가 포스트 백간에 유지되지 않습니다. 관련 행과 셀은 동일한 ID를 보유하지만 데이터는 유지하지 않습니다. 왜 안돼?

+0

ViewState를 사용할 수 있습니까? – n8wrl

+0

잘 모름 - 어떻게 그리고 어디에서 할 수 있습니까? – statue

+0

ASP : Table은 ViewState에서 내용을 유지해야한다고 생각하지 않지만 완전히 확신 할 수는 없습니다. 일반적으로 ASP.NET 재고 있음 모든 포스트 백 모든 동적 컨트롤을 복원해야합니다. 서버 측에 충분한 데이터가없는 경우 ViewState에 추가 정보를 입력 할 수 있습니다. – Zarat

답변

10

동적 컨트롤을 각 포스트 백에서 폼에 다시 추가해야합니다. 일반적으로이 작업은 페이지 수명주기의 Init 단계에서 수행됩니다. 동적으로 추가 한 컨트롤에는 실제로 ViewState가 있습니다. 해당 컨트롤이 이전과 완전히 동일한 ID를 사용하여 컨트롤 트리에 다시 추가되면 ViewState에서 지속 된 값이 다시 나타납니다.

동적 컨트롤 사용에 대한 간단한 팁은 this article을 확인하거나 4 Guys from Rolla에서이 자습서를 확인하십시오.

관련 문제