2011-04-22 2 views
3

Я получил очень простой объект:Создание ASP.NET Repeater динамически в C# Bound к списку объектов

public class DocumentType 
{ 
    private int id; 
    private string name; 

    public int ID 
    { 
     get { return this.id; } 
     set { this.id = value; } 
    } 

    public string Name 
    { 
     get { return this.name; } 
     set { this.name = value; } 
    } 
} 

У меня есть список объектов DocumentType: List<DocumentType> documentTypes = getDocuments();

Я m, работая над настраиваемым элементом управления, где я пытаюсь динамически создавать ретранслятор и динамически связывать его с моим списком объектов. Вот мой код:

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

John - спасибо, ваш код работал отлично! Во всем примере кода, который я смотрел, я не мог найти этот фрагмент. У меня было ощущение, что это простое задание. Еще раз спасибо! – Dexter

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