0
| Level1      | Level2               | Level3       | Level4|

| ELECTRONICS | TELEVISIONS          | NULL         | NULL  |

| ELECTRONICS | TELEVISIONS          | LCD          | NULL  |

| ELECTRONICS | PC                   | NULL         | NULL  |

| ELECTRONICS | PORTABLE ELECTRONICS | MP3 PLAYERS  | FLASH |

| ELECTRONICS | PORTABLE ELECTRONICS | CD PLAYERS   | NULL  |

| ELECTRONICS | PORTABLE ELECTRONICS | 2 WAY RADIOS | NULL  |

在一个遗留数据库中,我有这个表,我试图在一个很好的层次结构 html ul li 列表中打印出来。我一直在 stackoverflow 上尝试不同的答案以在 C# 中构建对象,但它们都有 parentID 和 childID,并且在这种情况下对我有用。

我正在尝试这段代码,但我知道它真的很糟糕,

    List<Node> FlatToHierarchy(IList<SearchWord> list)
    {
        List<Node> nodes = new List<Node>();

        foreach (SearchWord x in list)
        {
            if (x.Level2 != " " && x.Level3 == " ")
            {
                Node node = new Node();
                node.Parent = x.Level1;
                node.Child = x.Level2;
                node.Keyword = x.Keyword;
                nodes.Add(node);
                //dict.Add(node.Parent, node);
            }

            if (x.Level3 != " " && x.Level4 == " ")
            {
                Node node = new Node();
                node.Parent = x.Level2;
                node.Child = x.Level3;
                node.Keyword = x.Keyword;
                nodes.Add(node);
                //dict.Add(node.Parent, node);
            }

            if (x.Level4 != " ")
            {
                Node node = new Node();
                node.Parent = x.Level3;
                node.Child = x.Level4;
                node.Keyword = x.Keyword;
                nodes.Add(node);
                //dict.Add(node.Parent, node);
            }
        }

        return nodes;
    }
4

2 回答 2

1

为了建立真正的层次结构,您class Node需要在类中有子项。添加List<Node>Node以及Add方法,因此数据包含层次结构。然后你可以建立一个 html li/ul 列表。例如,Node该类可能如下所示:

public class Node
{
    public string Name { get; set; } // Current node name
    public string Parent { get; set; }
    public string Keyword { get; set; }
    public int Level { get; set; } // Optional

    private List<Node> _children = new List<Node>();
    public List<Node> Children { get { return _children; } }

    public Node AddChild(Node child)
    {
        _children.Add(child);
        return this;
    }   
}

或者你Parent可以引用一个节点:

public class Node
{
    public Node Parent { get; set; }
    public string ParentName { get { Parent != null ? Parent.Name : null; } }
    // ...
}

然后要构建 html li/ul 列表,您递归地遍历 Node 结构。

编辑:实际上,现在我想到了,您可能只想从数据构建一个分层的 XML 文档。然后您可以从 xml 构建 ul/li:

public class Data
{
    public string Level1 { get; set; }
    public string Level2 { get; set; }
    public string Level3 { get; set; }
    public string Level4 { get; set; }
}

public Data[] sampleData = new Data[] {
    new Data { Level1 = "ELECTRONICS", Level2 = "TELEVISIONS", Level3 = null, Level4 = null },
    new Data { Level1 = "ELECTRONICS", Level2 = "TELEVISIONS", Level3 = "LCD", Level4 = null },
    new Data { Level1 = "ELECTRONICS", Level2 = "PC", Level3 = null, Level4 = null },
    new Data { Level1 = "ELECTRONICS", Level2 = "PORTABLE ELECTRONICS", Level3 = "MP3 PLAYERS", Level4 = "FLASH" },
    new Data { Level1 = "ELECTRONICS", Level2 = "PORTABLE ELECTRONICS", Level3 = "CD PLAYERS", Level4 = null },
    new Data { Level1 = "ELECTRONICS", Level2 = "PORTABLE ELECTRONICS", Level3 = "2 WAY RADIOS", Level4 = null },
};

XElement AddNode(string name)
{
    return new XElement("Node", 
        new XAttribute("Name", name));
}

// NOTE: This is not optimized, but you get the idea...
XDocument BuildHierarchy(IEnumerable<Data> data)
{
    XElement root = new XElement("Root");
    XDocument xdoc = new XDocument(root);
    XElement level1 = null;
    XElement level2 = null;
    XElement level3 = null;
    XElement level4 = null;

    foreach (var item in data)
    {
        // Assumes item.Level1 is never empty...
        if (level1 == null || string.Compare(item.Level1, level1.Attribute("Name").Value) != 0)
        {
            level1 = AddNode(item.Level1);
            root.Add(level1);
            level2 = null;
            level3 = null;
            level4 = null;
        }

        if (string.IsNullOrWhiteSpace(item.Level2))
        {
            level2 = null;
            level3 = null;
            level4 = null;
            continue;
        }

        if (level2 == null || string.Compare(item.Level2, level2.Attribute("Name").Value) != 0)
        {
            level2 = AddNode(item.Level2);
            level1.Add(level2);
            level3 = null;
            level4 = null;
        }

        if (string.IsNullOrWhiteSpace(item.Level3))
        {
            level2 = null;
            level3 = null;
            level4 = null;
            continue;
        }

        if (level3 == null || string.Compare(item.Level3, level3.Attribute("Name").Value) != 0)
        {
            level3 = AddNode(item.Level3);
            level2.Add(level3);
            level4 = null;
        }

        if (string.IsNullOrWhiteSpace(item.Level4))
        {
            level4 = null;
            continue;
        }

        if (level4 == null || string.Compare(item.Level4, level4.Attribute("Name").Value) != 0)
        {
            level4 = AddNode(item.Level4);
            level3.Add(level4);
        }
    }

    return xdoc;
}
于 2012-11-07T15:14:46.123 回答
0

我会将此表放入一组行并将每列上的行分组,但这取决于您最终想要的数据结构。

如果您只需要 HTML 中的分层列表并且它只有 4 列,请相应地执行按Level1Level2、排序的数据库查询Level3Level4然后遍历它们。保留一个指示器以查看级别是否更改并根据需要输出 HTML 代码。

于 2012-11-07T14:37:13.280 回答