【发布时间】:2013-12-21 05:05:38
【问题描述】:
我已经进行了一些搜索,并找到了与我的场景相似的任何内容,并且希望能有另一双眼睛给我一些建议。
我的任务是显示一棵数据树,并制定了创建此表结构的存储过程:
它应该包含我需要的所有内容,包括级别、父级和文件夹 ID [document_category_id]
计划是使用以下 HTML 结构显示数据
<div class="parent">Folder 1</div>
<div class="sublevel">
<div class="subfolder">Folder 1 Subfolder</div>
<div class="sublevel">
<div class="subfolder">Folder 1 Subfolder Level 2</div>
</div>
<div class="parent">Folder 2</div>
<div class="sublevel">
<div class="subfolder">Subfolder 1</div>
<div class="subfolder">Subfolder 2</div>
</div>
子级类有一个创建缩进的边距,随后的子节点插入增加了标识。
这是 C# 代码。诚然,我在递归方面没有太多经验,我有兴趣学习如何解决这个问题。我在这篇文章之后轻轻地建模了这个:non-normalized heirarchy / stackoverflow 但你会发现有一些不同
SqlConnection connection = null;
connection = new SqlConnection(ConfigurationData.databaseConnectionString);
SqlCommand command = new SqlCommand("myconnectionstring", connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@myparameter", myparameter);
try {
connection.Open();
SqlDataReader reader = command.ExecuteReader();
int rowcount = 0;
int count = reader.FieldCount;
while (reader.Read()) {
_folderCategoryId = (int)reader["document_category_id"];
if (!DBNull.Value.Equals(reader["parent_category_id"])) {
_folderParentCategoryId = (int)reader["parent_category_id"];
}
if (DBNull.Value.Equals(reader["parent_category_id"])) {
_folderParentCategoryId = 0;
}
_level = (int)reader["level"];
_folderName = (string)reader["name"];
_folderDescription = (string)reader["description"];
rowcount = rowcount + 1;
//parent catgories get their own closed "parent" class div
if (_level == 0) {
_displayString.Append("<div class=\"parent\" >");
_displayString.Append(_folderName);
_displayString.Append("</div>");
}
for (int i = 1; i <= _level; i++) {
WriteNode(reader, _displayString);
}
_displayString.Append("</div>");
}
if (rowcount < 1) {
_displayString.Clear();
_displayString.Append("No Folders");
}
}
catch {
_displayString.Clear();
_displayString.Append("Error Retreiving Documents List");
}
finally {
if (connection != null) {
connection.Close();
}
}
}
// recursively write out each node
public static void WriteNode(SqlDataReader reader, StringBuilder _displayString) {
// find children rows...
int level = (int)reader["level"];
string name = (string)reader["name"];
if (level >= 1) {
_displayString.Append("</div>");
_displayString.Append("<div class=\"sublevel\">");
_displayString.Append(name);
}
}
所以,我知道这里显然有问题。我一直在修改它,它有点工作,但大多不可靠通常有未关闭的 div,或者关闭 div 标记过多,具体取决于孩子的数量。
很可能是对 WriteNode 方法的调用 - 我应该在这里检查以前的 folderid 值吗?长度够不够?我应该在这里关闭一个 div 吗?
任何指针将不胜感激。
【问题讨论】:
标签: c# recursion tree hierarchy stringbuilder