2013-07-25 9 views
3

큰 테이블에 일종의 데이터를 표시하는 비 시각적 웹 파트 인 SharePoint 2010을 개발 중입니다. 테이블 행은 웹 파트의 일부인 DropDownList에서 필터 조건을 선택하여 필터링해야합니다.CreateChildControls 후에 Controls.Remove()가 작동하지 않습니다?

DropDownList의 OnSelectedIndexChanged 이벤트는 CreateChildControls 이후와 OnPreRender 전에 발생합니다. 테이블의 셀에는 연결된 OnClick 이벤트가있는 LinkButton이 포함되어 있으므로 OnClick 이벤트가 실행되도록하려면 CreateChildControls에서 만들어야합니다.

DropDownList의 OnSelectedIndexChanged가 실행될 때까지 숨길 테이블 행을 알 수 없으므로 CreateChldControls에서 가능한 모든 테이블 행을 만들고 나중에 필터링 된 OnSelectedIndexChanged 이벤트를 직접 제거하거나 OnPreRender에서 제거하려고합니다. . 행은 부모 테이블의 컨트롤 컬렉션에서 물리적으로 제거되었지만 표시되지 않습니다.

테스트를 통해 CreateChildControls 메서드를 생성 한 후 임의의 행을 제거하려고 시도했지만 제대로 작동하지 않고 행이 렌더링되지 않았습니다.

어떻게 행을 제거 :

Table mt = FindControl("matrixtable") as Table; 

    Helpers.Log("Controls in Table: " + mt.Controls.Count); 
    foreach (int kdid in kdIdsInvisible) 
    { 
    TableRow c = mt.FindControl("kdrow" + kdid) as TableRow; 
    Helpers.Log(c.ID); 
    mt.Controls.Remove(c); 
    } 
    Helpers.Log("Controls in Table: " + mt.Controls.Count); 

출력 :

Controls in Table: 88 
Controls in Table: 2 

그러나 모든 행이 아직 렌더링 ...

이에 대한 해결책이 있습니까? 미리 감사드립니다.

+0

행을 제거하는 작업 예입니다 함께 라인 mt.Controls.Remove(c);를 교체하려고? PreRender에서 제거를 시도하십시오. – Peter

+0

먼저 OnPreRender에서 컨트롤을 제거하려고했습니다. 그것은 작동하지 않았다. 컨트롤이 제거되었지만 (나는 체크했다) 어쨌든 렌더링되었다. 컨트롤을 제거하는 것은 CreateChildControls에서만 작동하지만 현재 제거 할 항목을 알지 못합니다. 나는 그것을 OnPreRender에서 알 것입니다. 닭고기 또는 계란 딜레마. – elsni

+0

CreateChildControls에 테이블을 추가하는 대신 항목을 별도의 목록에 추가하십시오. 그런 다음 추가 할 항목을 알고있는 OnPreRender를 추가하십시오. 그냥 해결 방법. 코드에 뭔가 이상한 점이있다. init 또는 load에 동적 컨트롤을 추가하지 않으면 포스트 백 이벤트를 처리하는 데 문제가 발생할 것이다.어쩌면 거기에 올바른 렌더링을 할 viewstate 목록을 저장할 수 있습니다. – Peter

답변

2

디버깅 :

루프를 통해 화면에 테이블의 모든 행의 모든 ​​ID를 작성합니다.

그런 다음 다시 반복하여 삭제 된 모든 행 ID를 화면에 씁니다.

삭제되지 않은 두 행을 찾아서 ID가 있는지 확인하십시오. 분할 테이블 셀 또는 뭔가있을 수 있습니다.

최악의 경우, Visual Studio에서 WP를 디버그하고 하나씩 삭제 된 행을보고 테이블 개수를보고 건너 뛴 것을 확인하십시오. 즉각적인 창에 대해 해당 행을 삭제하고 어떤 오류가 발생하는지 확인하십시오.

1

테이블 행 컬렉션에서 행을 제거해야한다고 생각합니다. 여기 mt.Rows.Remove(c);

당신이 당신의 제거 컨트롤 후 데이터 바인딩되지 않았는지하는 SelectedIndexChanged event

[ToolboxItemAttribute(false)] 
public class TableTest : WebPart 
{ 
    protected override void CreateChildControls() 
    { 
     // Build a table 
     Table t = new Table(); 
     t.ID = "table"; 
     for (int i = 0; i < 11; i++) 
     { 
      TableRow tr = new TableRow(); 
      t.Rows.Add(tr); 
      for (int j = 0; j < 5; j++) 
      { 
       TableCell tc = new TableCell(); 
       tc.Controls.Add(new LiteralControl("Row " + i + " Cell " + j)); 
       tr.Cells.Add(tc); 
      } 
     } 
     // Add a dropdown 
     DropDownList dl = new DropDownList(); 
     dl.AutoPostBack = true; 
     dl.Items.Add(new ListItem { Text = "Odd", Value = "1" }); 
     dl.Items.Add(new ListItem { Text = "Even", Value = "2" }); 
     dl.SelectedIndexChanged += dl_SelectedIndexChanged; 

     // Add to the controls collection 
     Controls.Add(dl); 
     Controls.Add(t); 
    } 

    void dl_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     // Get the table and dropdown 
     Table t = FindControl("table") as Table; 
     DropDownList dl = sender as DropDownList; 
     if (t != null && dl != null) 
     { 
      int i = 1; 
      // Set up a list to hold the rows to remove 
      IList<TableRow> removeRows = new List<TableRow>(); 

      if (dl.SelectedValue == "1") // Get all odd rows 
      {     
       foreach (TableRow tr in t.Rows) 
       { 
        if (i % 2 == 0) 
        { 
         removeRows.Add(tr); // Add odd rows to the list of rows to remove 
        } 
        i++; 
       } 
      } 
      else // Get all even rows 
      { 
       foreach (TableRow tr in t.Rows) 
       { 
        if (i % 2 == 1) 
        { 
         removeRows.Add(tr); // Add even rows to the list of rows to remove 
        } 
        i++; 
       } 
      } 

      foreach (var tr in removeRows) 
      { 
       t.Rows.Remove(tr); // Remove the rows from the table 
      } 
     } 
    } 
}