Динамическое создание повторителя ASP.NET в C #, привязанного к списку объектов

У меня очень простой объект:

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();

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

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);
}

Жатка и разделитель работают отлично. Я не могу понять, как привязать шаблон элемента к текущему элементу, чтобы он отображался. Я знаю, что то, что у меня там сейчас, полностью сломано, но я безуспешно пробовал несколько вариантов.

Заранее благодарим за любую помощь или указатели в правильном направлении!


person Dexter    schedule 22.04.2011    source источник


Ответы (1)


Проблема, с которой вы столкнулись, заключается в том, что вы предполагаете, что 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();
person John Kraft    schedule 22.04.2011
comment
Джон - спасибо, ваш код работал отлично! Во всех примерах кода, которые я просмотрел, я не смог найти этот фрагмент. У меня было ощущение, что где-то это было простое задание. Еще раз спасибо! - person Dexter; 22.04.2011