创建ASP.NET Repeater在c#中动态绑定到对象列表

本文关键字:动态绑定 对象 列表 ASP NET Repeater 创建 | 更新日期: 2023-09-27 17:52:40

我有一个非常简单的对象:

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

标题和分隔符工作得很好。我不知道如何将项目模板绑定到当前项目以使其显示。我知道我现在在那里的东西完全坏了,但我试了几个不同的版本,都没有运气。

提前感谢您在正确方向上的任何帮助或指示!

创建ASP.NET Repeater在c#中动态绑定到对象列表

您遇到的问题是您假设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();