C#递归函数中的回溯变量

时间:2011-09-05 05:11:37

标签: c#

我在同一个sql表中有这些数据。我需要为以下数据创建一个树状结构。一切似乎工作得很好,除了缩进不正常。我遗漏了一些我无法弄清楚的小事。我将不胜感激。

这是同一张表中的数据

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 个答案:

答案 0 :(得分:4)

indentLevel末尾没有减少 BuildTable的任何内容。

就个人而言,我会更改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为空时该方法不执行任何操作,但这意味着您的代码有点混乱。我个人更喜欢总是使用大括号。