使用缩进显示父/子名称

时间:2011-09-23 19:20:45

标签: c# asp.net

我有一个有父/子关系的对象。

下面是我的短版本,但下面是核心道具

public class Company
{
  Name {get;set;}
  List<Company> ChildCompany {get;set;} 
}

显示如下内容:

-----ABC Corporation (in this chas ABC has child company so it will display right indent)
----------ABC Child
----------ABC One
----------ABC Two
-----BBC Corporation (in this case no child company)
-----CBS

-----CNN Corporation
----------ABC
----------BBC
----------NBC

我的代码:

Company company = new Company();
company = GetDataForCompany(); //DAL

if(!string.IsNullEmpty(company.Name))
{

     //dispaly Name
     PlaceHolder ph;
     l = new Literal();
     l.Text = "<ul>" + Environment.NewLine;
     ph.Controls.Add(l);
     l = new Literal();
     l.Text = "<li">";
     ph.Controls.Add(l);
     hl = new HyperLink();
     hl.Text = company.Name;
     ph.Controls.Add(hl);


    foreach (Company item in company)
    {
          l = new Literal();
          l.Text = "<li">";
          ph.Controls.Add(l);
          hl = new HyperLink();
          hl.Text = item.Name;
          ph.Controls.Add(hl);
    }

}

上面的代码似乎没有完全呈现我想要的内容,如上所示。

2 个答案:

答案 0 :(得分:3)

首先,文字不是用于这样的任务,但你有例如HtmlGenericControl,它更适合你的目标。对于持有者来说也是如此 - 这些都是模板化的。

HtmlGenericControl unorderedList = new HtmlGenericControl("ul");

HtmlGenericControl tempItem = null;
HtmlGenericControl tempAnchor = null;

foreach (Company item in company)
{
     tempItem = new HtmlGenericControl("li");
     unorderedList.Controls.Add(tempItem);

     tempAnchor = new HtmlGenericControl("a");
     tempAnchor.Controls.Add(new Literal { Text = item.Name });
     tempItem.Controls.Add(tempAnchor);
}

如果您需要更多功能,可以使用System.Web.HtmlControls命名空间,该命名空间具有任何常见(X)HTML表单元素的Web控件等等:

关于文字,这些用于本地化或在服务器控件中表示文字文本的好方法,因为文字具有与任何其他控件一样的标识符,简化文本替换和其他任务。

另一个要点是缩进将通过重写服务器控件的方法来实现,例如Render,RenderChildren等,它们提供了对HtmlTextWriter的访问,后来文本流编写器将其输出放到HTTP响应流中。

答案 1 :(得分:2)

您没有将Child公司嵌套在另一个无序列表中。您需要检查子公司并将这些列表项嵌套在另一个列表中,以使HTML看起来像您需要的那样。

// Code to display name here....
if (company.ChildCompany != null && company.ChildCompany.Count > 0)
{
    l = new Literal();
    l.Text = "<ul>";
    ph.Controls.Add(l);


    foreach (Company item in company.ChildCompany)
    {
        // Code for children.
    }

    l = new Literal();
    l.Text = "</ul>";
    ph.Controls.Add(l);
}

输出应该看起来像:

<ul>
     <li>Company
         <ul>
             <li>Child Company #1</li>
             <li>Child Company #2</li>
         </ul>
     </li>
 </ul>