2010-06-09 2 views
1

서버 측에서 테이블에 행을 추가하려면 어떻게합니까?asp.net 테이블에 행을 동적으로 추가하는 방법은 무엇입니까?

if (!Page.IsPostBack) 
    { 
     Session["table"] = TableId; 
    } 
    else 
    { 
     TableId = (Table)Session["table"]; 
    } 

protected void btnAddinRow_Click(object sender, EventArgs e) 
{ 
     num_row = (TableId.Rows).Count; 

     TableRow r = new TableRow(); 
     TableCell c1 = new TableCell(); 
     TableCell c2 = new TableCell(); 
     TextBox t = new TextBox(); 

     t.ID = "textID" + num_row; 
     t.EnableViewState = true; 

     r.ID = "newRow" + num_row; 
     c1.ID = "newC1" + num_row; 
     c2.ID = "newC2" + num_row; 

     c1.Text = "New Cell - " + num_row; 
     c2.Controls.Add(t); 

     r.Cells.Add(c1); 
     r.Cells.Add(c2); 

     TableId.Rows.Add(r); 
     Session["table"] = TableId; 
} 

디버그에서 "TableID"의 숫자를 찾았지만 행이 그려지지 않았습니다.

이 문제에 대한 아이디어가 있습니까? 감사합니다.

답변

3

당신이 Dynamic Controls와 혼동 스럽다고 생각합니다 ... 테이블의 각 행을 동적으로 생성하고 있습니다 ... 모든 페이지주기마다 (같은 이름으로) 생성해야합니다. 포스트 백이거나 아니 ...

간단히 말해서 .aspx (태그) 페이지에서 코드를 ... 모든 포스트 백에서 수행하십시오 ...

코드에서 세션에서 테이블을 가져 오지만 폼에 다시 추가하지는 않습니다 ... 아래 선은 그것을한다.

  this.form1.Controls.Add(TableId); 

여기는 작동하는 코드입니다.이게 도움이 되길 바랍니다. 질문이 있으시면 알려주십시오 ... 또한 DataSource 객체 데이터 소스를 사용하여 DataGrid를 시도해 볼 수 있습니다. 그러면 DB에 쓰지 않고 다시 게시 할 때 데이터를 유지하는 데 도움이됩니다.

Table TableId = new Table(); 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if(!IsPostBack) 
     { 
      TableId.ID = "MyTable"; 
     } 
     else 
     { 
      TableId = (Table)Session["table"]; 
      this.form1.Controls.Add(TableId); 
     } 
    } 

    protected void Page_PreRender(object sender, EventArgs e) 
    { 
     Session["table"] = TableId; 
    } 


    protected void btnAddinRow_Click(object sender, EventArgs e) 
    { 
     int num_row = (TableId.Rows).Count; 

     TableRow r = new TableRow(); 
     TableCell c1 = new TableCell(); 
     TableCell c2 = new TableCell(); 
     TextBox t = new TextBox(); 

     t.ID = "textID" + num_row; 
     t.EnableViewState = true; 

     r.ID = "newRow" + num_row; 
     c1.ID = "newC1" + num_row; 
     c2.ID = "newC2" + num_row; 

     c1.Text = "New Cell - " + num_row; 
     c2.Controls.Add(t); 

     r.Cells.Add(c1); 
     r.Cells.Add(c2); 

     TableId.Rows.Add(r); 
     Session["table"] = TableId; 
    } 
+0

대단히 고마워요. 폼에 컨트롤을 추가 할 때 "동일한 ID가있는 두 컨트롤"이라는 예외가 발생했습니다. 그리드 뷰를 사용하여 시도 할 것입니다. 내가 이것을 주석 할 때 : this.form1.Controls.추가 (TableId); 오류는 발생하지 않지만 행을 추가하면 작동하지 않습니다. 고맙습니다. – TimeIsNear

+0

디자인 모드 (aspx 태그 페이지)로도 테이블을 만들었을 것입니다. 위의 코드가 작동하려면 aspx 페이지에서 테이블을 만들 필요가 없습니다. –

+0

그러나 나는 aspx에서 일한다. 내가 추천 한대로 gridview를 사용하려고하지만이 구성 요소에 익숙하지 않습니다. 거기에 somme 어디에 objecdatasource와 세션을 사용하여 예제가 무엇입니까? 뭔가 필요한 것 같습니다. 다시 왕이 되십시오. – TimeIsNear

0

ASP.NET 컨트롤에서 각 다시 게시를 다시 작성하므로 세션에서 테이블에 대한 링크 저장이 의미가 없습니다.

스토어 세션 (또는 viewstate가) 테이블 (DataTable을하거나 강력한 형식의 개체의 집합)에 대해 설명 일부 구조, 클릭 버튼 이벤트에이 구조에 행을 추가하고 OnPreRender 이벤트에서이 구조를 사용하여 테이블을 리 바인드.

+0

감사합니다. 테이블을 렌더링하는 방법은 무엇입니까? 어쩌면 세션에 저장된 테이블과 함께 작동 할 수 있습니다. 개체 테이블에서 숫자 행을 볼 수 있지만 그려지지 않습니다. - 표에서 데이터를 바인딩 할 필요가 없습니다. 삽입되지 않은 데이터는 읽을 수 없습니다. – TimeIsNear

2

왜 이렇게 강력하고 당신이 이것을 쉽게 수행 할 수있는 GridView 컨트롤이 아닌 테이블을 사용하게 될지 궁금합니다.

은의 GridView는 새 행을 작성해야하는 경우, 당신이 오직 할 필요가있는 DataTable에 새 DataRow를 생성하고 다시 결합, 그것은 DataSource 자신의 같은 DataTable으로 엮은, 그렇게 할 수 있습니다.

자바 스크립트 (Ajax 호출)를 사용하거나 코드 숨김으로 사용할 수 있습니다.

DataTable dt = (DataTable)Session["myData"]; 
DataRow dr = dt.NewRow(); 
dt.Rows.Add(dt); 

myGridView.DataSource = dt; 
myGridView.DataBind(); 

당신이, 당신은 쉽게 모든 행을 반복하고

public void SaveData() 
{ 
    myBusinessObjectCollection = new myBusinessObjectCollection(); 

    foreach (GridViewRow row in myGridView.Rows) 
    { 
     myBusinessObjectCollection.Add(
      new myBusinessObject 
      { 
       C1 = ((TextBox)row.FindControl("txtNewC1")).Text, 
       C2 = ((TextBox)row.FindControl("txtNewC2")).Text 
      }); 
    } 

    myBusinessObjectCollection.Save(); 
} 
처럼, 당신은 행마다 필요로 무엇을 할 수 그들이 alwways 고유해야하므로 ID의의에 대해 걱정할 필요가, 예를 들면 저장을하지 않습니다
+0

감사합니다. 그러나이 테이블은 데이터를 임시로 얻으려는 것으로, 저장된 데이터가 필요하지 않으며, 읽기 전용입니다. 그러나 치료를 위해 서버 측에서 이러한 임시 데이터가 필요합니다. – TimeIsNear

+0

혹시 쿠키에 대해 귀 해봤습니까? 또는 일시적으로 데이터를 저장할 숨겨진 입력? – balexandre

관련 문제