簡體   English   中英

在C#中動態創建ASP.NET轉發器綁定到對象列表

[英]Creating an ASP.NET Repeater Dynamically in C# Bound to an Object List

我有一個非常簡單的對象:

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

標題和分隔符工作得很好。 我無法弄清楚如何將項目模板綁定到當前項目以使其顯示。 我知道我現在所擁有的東西已經徹底破碎了,但我已經嘗試了幾種沒有運氣的變化。

提前感謝您提供正確方向的任何幫助或指示!

您遇到的問題是您假設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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM