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