2011-09-05 17 views
0

我在同一個sql表中有這樣的數據。我需要爲以下數據創建一個樹狀結構。一切似乎工作正常,但縮進不正常。我錯過了一些我無法弄清楚的小事。我會感謝任何幫助。C#遞歸函數中的回調變量

這是在同一個表中的數據

initiated_by 
--------------------- 
NULL,42521,42521,41651,41111,41111,41131,41651 

user_id (assigned to) 
--------------------- 
42521,41651,42681,41111,42021,41131,42001,43001 

我希望是如下。

42521 (at level 0) 
    41651 (at level 1) 
     41111 (at level 2) 
     42021(at level 3) 
     41131(at level 3) 
      42001(at level 4) 
     43001(at level 2) 
    42681 (at level 1) 

但我得到的是不正確的。我無法弄清indentLevel部分。 indentLevel是在類級別聲明的變量。

private void BuildTable(DataTable recordList) 
    { 
     foreach (DataRow dr in recordList.Rows) 
     { 

      TableRow tblRow = new TableRow(); 
      TableCell tblCell = new TableCell(); 

      tblCell.Controls.Add(GetDetailTable(dr, indentLevel)); 

      tblCell.HorizontalAlign = HorizontalAlign.Left; 
      tblRow.Cells.Add(tblCell); 
      mainTable.Rows.Add(tblRow); 

      //Do we have any child objects 
      int cId = Convert.ToInt32(dr["user_id"].ToString()); 
      DataTable dt = GetChildObjects(Convert.ToInt32(dr["user_id"].ToString()), masterDT); 

      if (dt.Rows.Count > 0) indentLevel = indentLevel+1; BuildTable(dt); 

     } 

    } 


    private Table GetDetailTable(DataRow dr, int indentLevel) 
    { 

     Table DetailTable = new Table(); 
     DetailTable.Width = Unit.Percentage(100); 
     DetailTable.CssClass = "SortableTable"; 

     TableRow tblRow = new TableRow(); 

     TableCell tblEmptyCell = new TableCell(); 
     tblEmptyCell.Width = Unit.Percentage(5); 
     tblEmptyCell.Controls.Add(new LiteralControl(string.Empty)); 
     tblEmptyCell.Width = Unit.Percentage(5 * indentLevel); 
     tblRow.Cells.Add(tblEmptyCell); 

     //To Display Name 
     TableCell tblCell = new TableCell(); 
     tblCell.Width = Unit.Percentage(15); 
     tblCell.CssClass = "alt-row-hover"; 
     LiteralControl lc = new LiteralControl(dr["user_id"].ToString()); 

     tblCell.Controls.Add(lc); 
     tblCell.HorizontalAlign = HorizontalAlign.Left; 
     tblRow.Cells.Add(tblCell); 
     mainTable.Rows.Add(tblRow); 

     //To Display Detials 
     TableCell tblCellDetials = new TableCell(); 
     tblCellDetials.CssClass = "alt-row"; 
     tblCellDetials.Width = Unit.Percentage(80); 

     StringBuilder detailString = new StringBuilder(); 
     detailString.Append("Action: " + Convert.ToString(dr["action_id"]) + "<br>"); 
     detailString.Append("Action Date: " + Convert.ToString(dr["action_date"]) + "<br>"); 
     detailString.Append("Comments: " + Convert.ToString(dr["comments"]) + "<br>"); 

     LiteralControl lcd = new LiteralControl(detailString.ToString()); 

     tblCellDetials.Controls.Add(lcd); 
     tblCellDetials.HorizontalAlign = HorizontalAlign.Left; 
     tblRow.Cells.Add(tblCellDetials); 


     DetailTable.Rows.Add(tblRow); 


     return DetailTable; 

    } 
} 
+1

調用'BuildTable(dt)'應該在'dt.Rows.Count> 0'時執行嗎?如果是這樣,它需要在一個'if'塊中。如果沒有,請相應地設置你的代碼的格式 –

+0

「indentLevel是在類級別聲明的變量」<---很好,這是一個問題。在本地範圍內並將值(+1)*傳遞給正在遞歸的函數。 – 2011-09-05 05:27:43

回答

4

你沒有什麼其BuildTable末遞減indentLevel

就個人而言,我會改變BuildTable採取indentLevel爲好,只是改變這一點:

if (dt.Rows.Count > 0) indentLevel = indentLevel+1; BuildTable(dt); 

這樣:

if (dt.Rows.Count > 0) 
{ 
    BuildTable(dt, indentLevel + 1); 
} 

然後只是把它最初:

BuildTable(rootTable, 0); 

...並完全刪除實例變量。這樣你根本不需要減少indentLevel;每個嵌套調用將自然而然地獲得正確的級別。

順便說一句,C#是不是基於行的,當談到塊 - 所以目前你的代碼就相當於:

// Current code 
if (dt.Rows.Count > 0) 
{ 
    indentLevel = indentLevel + 1; 
} 
BuildTable(dt, indentLevel); 

這實際上並不會做任何傷害在這種特殊情況,因爲dt.Rows爲空時該方法什麼也不做,但這意味着你的代碼有點混亂。我個人更喜歡總是使用大括號。