【问题标题】:Display Heirarchial Tree ASP C# / Stringbuilder / Recursion显示层次结构树 ASP C# / Stringbuilder / Recursion
【发布时间】: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


    【解决方案1】:

    几天前想通了。我使用的数据集不需要递归。

    if (_level > prevLevel) { //must be a child
                            _displayString.Append("<div class=");
                            _displayString.Append("\"subfolder\" >");
                            formatClickString(_displayString, _folderCategoryId, _uploadVisibility, _folderName);
                        }
                    if (_level < prevLevel) { //start new level
                            for (int i = 0; i <= prevLevel; i++) {
                                _displayString.Append("</div>");
                            }
                        _displayString.Append("<div class=\"subfolder\" >");
                        formatClickString(_displayString, _folderCategoryId, _uploadVisibility, _folderName);
    
                        }
                    if (_level == prevLevel) { //is child and own line
                        _displayString.Append("</div>");
                        _displayString.Append("<div class=\"subfolder\" >");
                        formatClickString(_displayString, _folderCategoryId, _uploadVisibility, _folderName);
    
                        }
                    prevLevel = _level;
    

    希望这会在其他人需要建造树时派上用场。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-19
      相关资源
      最近更新 更多