2013-08-21 1 views
2

Я хочу нарисовать Html как в Preview.Как я могу нарисовать итерирующий шаблон списка уль-ли?

Просмотреть предварительный просмотр click here. Просмотрите страницу Source, чтобы просмотреть рендеринг ul -li. Для этого я написал способ, показанный ниже

private void DrawTree(HtmlGenericControl ParentULTag, int count) 
    { 

     for (int i = 0; i < count; i++) 
     { 
      HtmlGenericControl ChildLi = new HtmlGenericControl("li"); 
      HtmlGenericControl ChildUl = new HtmlGenericControl("ul"); 
      ChildLi.Controls.Add(ChildUl); 
      ParentULTag.Controls.Add(ChildLi); 
      ChildLi.InnerText = i.ToString(); 
      DrawTree(ChildUl, i); 
     } 
    } 

Но рисовать его как этот

<ul> 
<li>1</li> 
<li>2</li> 
<li>3</li> 
<li>4</li> 
</ul> 

Я инициированного метод в PageLoad, как показано

HtmlGenericControl Initial = new HtmlGenericControl("ul"); 
DrawTree(Initial,4); 

Что ошибка в этом код?

+0

Кажется, что должны быть две петли, нет необходимости в рекурсии. –

+0

@AhmedKRAIEM тогда как это было бы? –

+0

Мне не нужен метод двух циклов. Я хочу сделать это рекурсивно. Это не настоящий случай, который мне нужен. –

ответ

0

Проблема была проста

private void DrawTree(HtmlGenericControl ParentULTag, int count) 
    { 

     for (int i = 0; i < count; i++) 
     { 
      HtmlGenericControl ChildLi = new HtmlGenericControl("li"); 
      HtmlGenericControl ChildUl = new HtmlGenericControl("ul"); 
      ChildLi.InnerText = i.ToString(); 
      ChildLi.Controls.Add(ChildUl); 
      DrawTree(ChildUl, i); 
      ParentULTag.Controls.Add(ChildLi); 
     } 
    } 

Пожалуйста, обратите внимание на положение линии ChildLi.InnerText = i.ToString(); , но до сих пор не знаю, почему его так

1

Попробуйте это

HtmlGenericControl Initial = new HtmlGenericControl("ul"); 
DrawTree(ref Initial,4); 

методу

private void DrawTree(ref HtmlGenericControl ParentULTag, int count) 
    { 

     for (int i = 0; i < count; i++) 
     { 
      HtmlGenericControl ChildLi = new HtmlGenericControl("li"); 
      HtmlGenericControl ChildUl = new HtmlGenericControl("ul"); 
      ChildLi.Controls.Add(ChildUl); 
      ParentULTag.Controls.Add(ChildLi); 
      ChildLi.InnerText = i.ToString(); 
      DrawTree(ref ChildUl, i); 
     } 
    } 
+1

'HtmlGenericControl' уже является ссылочным типом. Тогда должен ли я? –

+2

Вам не нужен ref, поскольку он уже является ссылочным типом –

3

Попробуйте это:

private static HtmlGenericControl GenerateList(int count) 
    { 
     HtmlGenericControl parent = new HtmlGenericControl("ul"); 
     for (int i = 1; i <= count; i++) 
     { 
      HtmlGenericControl ChildLi = new HtmlGenericControl("li"); 
      ChildLi.InnerText = i.ToString(); 
      HtmlGenericControl ChildUl = new HtmlGenericControl("ul"); 
      ChildLi.Controls.Add(ChildUl); 
      for (int j = 1; j <= i; j++) { 
       HtmlGenericControl FinalLi = new HtmlGenericControl("li"); 
       FinalLi.InnerText = j.ToString(); 
       ChildUl.Controls.Add(FinalLi); 
      } 
      parent.Controls.Add(ChildLi); 
     } 
     return parent; 
    } 

Edit:

Вы должны представлять свой вклад в виде древовидной структуры. Здесь я использовал Node объект, который имеет ID и Children свойства:

class Node 
{ 
    public int ID { get; set; } 
    public Node[] Children { get; set; } 
    public Node(int id, Node[] children) 
    { 
     ID = id; 
     Children = children; 
    } 
    public Node(int id) 
    { 
     ID = id; 
     Children = new Node[] { }; 
    } 
} 

class Program 
{ 

    public static HtmlGenericControl GetList(Node root) 
    { 
     HtmlGenericControl ul = new HtmlGenericControl("ul"); 
     GetListImpl(root, ul); 
     return ul; 
    } 

    private static void GetListImpl(Node root, HtmlGenericControl rootElement) 
    { 
     foreach (var item in root.Children) 
     { 
      HtmlGenericControl li = new HtmlGenericControl("li"); 
      li.InnerText = item.ID.ToString(); 
      if (item.Children.Length > 0) 
       li.Controls.Add(GetList(item)); 

      rootElement.Controls.Add(li); 
     } 
    } 

    public static string HtmlGenericControlToString(HtmlGenericControl control) 
    { 
     string contents = null; 
     using (System.IO.StringWriter swriter = new System.IO.StringWriter()) 
     { 
      HtmlTextWriter writer = new HtmlTextWriter(swriter); 
      control.RenderControl(writer); 
      contents = swriter.ToString(); 
     } 
     return contents; 
    } 


    static void Main(string[] args) 
    { 
     Node root = new Node(0, 
      new Node[]{ 
       new Node(1, new Node[]{ 
        new Node(1), 
        new Node(2) 
       }), 
       new Node(2, new Node[]{ 
        new Node(1), 
        new Node(2, new Node[]{ 
         new Node(1) 
        }) 
       }) 
      }); 
     var ul = GetList(root); 
     var html = HtmlGenericControlToString(ul); 
     Console.WriteLine(html); 
    } 
} 
+0

, пожалуйста, ознакомьтесь с обновленным вопросом. На самом деле мне нужна структура родитель-ребенок. Но я допустил ошибки в примере. Простите за это! –

Смежные вопросы