2011-04-22 41 views
3

オブジェクトのリストにバインドされたC#でASP.NETリピータの動的作成します私は動的にリピータを作成し、それを自分のオブジェクトリストに動的にバインドしようとしているカスタムコントロールに取り組んでいます。私のコードは次のとおりです。は、私は非常に単純なオブジェクトを持っている

private Repeater docList; 
docList = new Repeater(); 
docList.DataSource = documentTypes; 
docList.DataBind(); 

foreach (RepeaterItem repeatItem in docList.Items) 
{ 
    // if condition to add HeaderTemplate Dynamically only Once 
    if (repeatItem.ItemIndex == 0) 
    { 
     RepeaterItem headerItem = new RepeaterItem(repeatItem.ItemIndex, ListItemType.Header); 
     HtmlGenericControl hTag = new HtmlGenericControl("h4"); 
     hTag.InnerHtml = "Header"; 
     repeatItem.Controls.Add(hTag); 
    } 

    // Add ItemTemplate DataItems Dynamically 

    RepeaterItem repeaterItem = new RepeaterItem(repeatItem.ItemIndex, ListItemType.Item); 
    Label lbl = new Label(); 

    // This part is completely broken! 
    lbl.Text = string.Format("Content: {0} {1} <br />", (DocumentType)repeaterItem.DataItem).ID, repeaterItem.NamingContainer); 
    repeatItem.Controls.Add(lbl); 

    // Add SeparatorTemplate Dynamically 
    repeaterItem = new RepeaterItem(repeatItem.ItemIndex, ListItemType.Separator); 
    LiteralControl ltrlHR = new LiteralControl(); 
    ltrlHR.Text = "<hr />"; 
    repeatItem.Controls.Add(ltrlHR); 
} 

ヘッダーとセパレータが機能します。現在のアイテムにアイテムテンプレートをバインドして表示させる方法を理解できません。私は今そこにあるものが完全に壊れていることを知っていますが、私は運がないいくつかのバリエーションを試しました。

正しい方向への助けや指導に感謝します。

答えて

3

問題は、RepeaterItemにデータが含まれていると仮定していることです。それはしません。個々のアイテムの表示方法に関する情報が含まれています。そのインデックスを使用してデータソースに戻る必要があります。私はもっ​​と良い方法があるかどうかは分かりませんが、以下はどのように動作させるかです。

List<DocumentType> documentTypes = new List<DocumentType>(); 
documentTypes.Add(new DocumentType(){ ID=1, Name="Bob"}); 
documentTypes.Add(new DocumentType() { ID = 2, Name = "Tom" }); 
documentTypes.Add(new DocumentType() { ID = 3, Name = "Chick" }); 
Repeater docList = new Repeater(); 
docList.DataSource = documentTypes; 
docList.DataBind(); 

foreach (RepeaterItem repeatItem in docList.Items) 
{ 
    int index = repeatItem.ItemIndex; 
    DocumentType docType = ((IList<DocumentType>)docList.DataSource)[index]; 
    // if condition to add HeaderTemplate Dynamically only Once 
    if (index == 0) 
    { 
     HtmlGenericControl hTag = new HtmlGenericControl("h4"); 
     hTag.InnerHtml = "Header"; 
     repeatItem.Controls.Add(hTag); 
    } 

    // Add ItemTemplate DataItems Dynamically 

    RepeaterItem repeaterItem = new RepeaterItem(repeatItem.ItemIndex, ListItemType.Item); 
    Label lbl = new Label(); 

    // This part is completely broken! 
    lbl.Text = string.Format("Content: {0} {1} <br />", docType.ID, repeaterItem.NamingContainer); 
    repeatItem.Controls.Add(lbl); 

    // Add SeparatorTemplate Dynamically 
    LiteralControl ltrlHR = new LiteralControl(); 
    ltrlHR.Text = "<hr />"; 
    repeatItem.Controls.Add(ltrlHR); 
} 

StringBuilder sb = new StringBuilder(); 
docList.RenderControl(new HtmlTextWriter(new StringWriter(sb))); 
Text = sb.ToString(); 
+0

ジョン - ありがとう、あなたのコードは完璧に機能しました!私が見たすべてのサンプルコードで、そのスニペットを見つけることができませんでした。私はそれがどこかの簡単な割り当てだったと感じました。再度、感謝します! – Dexter

関連する問題