2011-09-23 4 views
1

私は親子関係を持つオブジェクトを持っています。以下インデント付きの親/子孫名の表示

は私が持っているものの短いバージョンですが、以下のコアは、このような

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

@AbuHamazahそれは何をレンダリングするのですか? –

+0

レンダリングとは何ですか? – Jason

+0

質問を編集して、予想されるマークアップと実際のマークアップを含めることはできますか? –

答えて

2

他の順序付けられていないリストに子会社を入れ子にしていません。子供の会社をチェックし、必要に応じて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> 
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); 
} 

あなたは、さらに機能が必要な場合は、共通のいずれかのためのWebコントロール(X)HTMLフォーム要素とよりを持っているSystem.Web.HtmlControls名前空間を使用することができます

リテラルについては、リテラルが他のコントロールと同じように識別子を持つため、テキスト置換やその他のタスクを容易にするため、リテラルについてはローカライゼーションやサーバーコントロールのリテラルテキストを表現するのに適しています。

Render、RenderChildrenなどのサーバーコントロールのメソッドをオーバーライドすることでインデントを行うことも重要です.HtmlTextWriter、後でその出力をHTTPレスポンスストリームに出力するHtmlTextWriterへのアクセスを提供します。

+0

HTMLGenericControlを使用することを含む私のものよりも良い答えです。 @Abuは、彼が自分の順序付けられていないリストで子どもの会社も入れ子にしていることを確認して、彼の後ろのインデントを取得する必要があります。 –

+0

@Blakeええ、ええ、私は答えがASP.NETとのより多くの連絡を取る必要があると思うので、私の答えで言及していない:) –

関連する問題