0

テーブルからの結果をhtml ul-listとして出力しようとしています。結果を List<> にバインドします。最も簡単な方法では、次のようになります。(バインディングをシミュレートしていますが、知っておくべき重要なことは、列をこの順序でソートすることです)

List<Link> linkList = new List<Link>();
linkList.Add(new Link() { Id = 1, ParentId = null, Title = "Sport" });
linkList.Add(new Link() { Id = 2, ParentId = 1, Title = "Football" });
linkList.Add(new Link() { Id = 3, ParentId = 1, Title = "Handball" });
linkList.Add(new Link() { Id = 4, ParentId = 1, Title = "Golf" });

この後、再帰メソッドを呼び出します。

public HtmlString navigation { get; set; }
navigation = CreateNavigation(linkList);

protected static HtmlString CreateNavigation1(List<Link> linkList, string result = "", int? index = null)
{
    int maxIndex = linkList.Count() - 1;
    if (!index.HasValue)
        index = maxIndex;
    else
        index--;

    Link selectedLink;

    if (index != 0)
    {
        selectedLink = linkList[index.Value];

        if (index != maxIndex)
        {
            if (linkList[index.Value + 1].ParentId != selectedLink.ParentId)
            {
                return new HtmlString("<li id=\"" + selectedLink.Id + "\">" + selectedLink.Title + "<ul>" + CreateNavigation1(linkList, result, index) + "</ul></li>");
            }
            else
            {
                return new HtmlString(CreateNavigation1(linkList, result, index) + "<li id=\"" + selectedLink.Id + "\">" + selectedLink.Title + "</li>");
            }
        }
        else
        {
            return new HtmlString(CreateNavigation1(linkList, result, index) + "<li id=\"" + selectedLink.Id + "\">" + selectedLink.Title + "</li>");
        }
    }
    else
    {
        selectedLink = linkList[index.Value];
        if (linkList[index.Value + 1].ParentId.HasValue && linkList[index.Value + 1].ParentId.Value == selectedLink.Id)
        {
            return new HtmlString("<ul><li>" + selectedLink.Title + "<ul>" + result + "</ul></li></ul>");
        }
        else
        {
            return new HtmlString("<ul><li>" + selectedLink.Title + "</li>" + result + "</ul>");
        }
    }
}

単一のステップを実行すると、正常に実行されると思いますが、出力を見ると、何が問題なのかわかりません。これが結果です

<ul><li>Sport<ul></ul></li></ul><li id="2">Football</li><li
id="3">Handball</li><li id="4">Golf</li>

私の願いは、このように見えることでした

<ul><li>Sport<ul><li id="2">Football</li><li id="3">Handball</li><li
id="4">Golf</li></ul></li></ul>

結果が文字列の後に追加され、文字列の中に追加されないのはなぜですか。私は言う

<ul><li>" + selectedLink.Title + "</li>" + append it here!(result) + "</ul>"

どこが間違っていると思いますか?

ありがとう!

4

1 に答える 1

0

コードの何が問題なのかは確認しませんでしたが、代わりにこの実装を確認してください。

public string GetTree(List<Link> linkList) {
  var sb = new StringBuilder();
  sb.Append("<ul>");

  foreach (var link in linkList) {
    if (!link.ParentId.HasValue) {
      sb.Append("<li>");
      sb.Append(link.Title);
      sb.Append(GetChildren(linkList, link.Id));
      sb.Append("</li>");
    }
  }

  sb.Append("</ul>");
  return sb.ToString();
}

private string GetChildren(List<Link> linkList, int parentId) {
  var sb = new StringBuilder();

  var childList = from m in linkList
                  where m.ParentId == parentId
                  orderby m.Id
                  select m;

  if (childList.Count() > 0) {
    sb.Append("<ul>");
    foreach (var link in childList) {
      sb.Append("<li>");
      sb.Append(link.Title);
      sb.Append(GetChildren(linkList, link.Id));
      sb.Append("</li>");
    }
    sb.Append("</ul>");
  }
  return sb.ToString();
}

navigation = new HtmlString(GetTree(linkList));
于 2013-05-13T23:17:50.353 に答える