如何从代码后面动态添加Repeater控件?

我有一个方法创建表,然后在之后创建一个转发器,表被渲染但转发器不会被渲染。 下面的方法首先简单地创建一个表,用信息填充它然后动态构造一个工作正常的转发器,但它只是不会将转发器呈现到aspx页面上。 我已经尝试使用stringbuilder将其作为字符串返回但仍然无法正常工作。 这是下面的代码。 谢谢

private void CreateUserExperienceTable(List experiences) { foreach (UserExperience experience in experiences) { HtmlGenericControl Header = new HtmlGenericControl("h3"); Header.InnerHtml = experience.Company; dvUserExperience.Controls.Add(Header); Table experienceTable = new Table(); TableRow experienceRoleRow = new TableRow(); TableRow experienceDescriptionRow = new TableRow(); TableRow experiencePeriodFromRow = new TableRow(); TableRow experiencePeriodToRow = new TableRow(); TableCell experienceRoleTitleCell = new TableCell(); TableCell experienceRoleValueCell = new TableCell(); TableCell experienceDescriptionTitleCell = new TableCell(); TableCell experienceDescriptionValueCell = new TableCell(); TableCell experiencePeriodFromTitleCell = new TableCell(); TableCell experiencePeriodFromValueCell = new TableCell(); TableCell experiencePeriodToTitleCell = new TableCell(); TableCell experiencePeriodToValueCell = new TableCell(); experienceRoleTitleCell.Text = "Role:"; experienceRoleValueCell.Text = experience.Role; experienceDescriptionTitleCell.Text = "Description:"; experienceDescriptionValueCell.Text = experience.CompanyDescription; experiencePeriodFromTitleCell.Text = "Period From: "; experiencePeriodFromValueCell.Text = experience.PeriodFrom.ToString("yy-mm-dd"); experiencePeriodToTitleCell.Text = "Period To:"; experiencePeriodToValueCell.Text = experience.PeriodTo == null ? "Present" : experience.PeriodTo.ToString(); experienceRoleRow.Cells.Add(experienceRoleTitleCell); experienceRoleRow.Cells.Add(experienceRoleValueCell); experienceDescriptionRow.Cells.Add(experienceDescriptionTitleCell); experienceDescriptionRow.Cells.Add(experienceDescriptionValueCell); experiencePeriodFromRow.Cells.Add(experiencePeriodFromTitleCell); experiencePeriodFromRow.Cells.Add(experiencePeriodFromValueCell); experiencePeriodToRow.Cells.Add(experiencePeriodToTitleCell); experiencePeriodToRow.Cells.Add(experiencePeriodToValueCell); experienceTable.Rows.Add(experienceRoleRow); experienceTable.Rows.Add(experienceDescriptionRow); experienceTable.Rows.Add(experiencePeriodFromRow); experienceTable.Rows.Add(experiencePeriodToRow); dvUserExperience.Controls.Add(experienceTable); String rptDuties = updatePageWithDuties(experience.Duties); //dvUserExperience.Controls.Add(rptDuties); } } private string updatePageWithDuties(List list) { Repeater rptDuties = new Repeater(); rptDuties.DataSource = list; rptDuties.DataBind(); foreach (RepeaterItem rptItem in rptDuties.Items) { if (rptItem.ItemIndex == 0) { RepeaterItem headerTemplate = new RepeaterItem(rptItem.ItemIndex, ListItemType.Header); HtmlGenericControl h4Tag = new HtmlGenericControl("h4"); h4Tag.InnerHtml = "Duties"; headerTemplate.Controls.Add(h4Tag); } RepeaterItem itemTemplate = new RepeaterItem(rptItem.ItemIndex, ListItemType.Item); Label dutyLabel = new Label(); ExperienceDuties expDuties = ((IList)rptDuties.DataSource)[rptItem.ItemIndex]; dutyLabel.Text = expDuties.Description; itemTemplate.Controls.Add(dutyLabel); RepeaterItem seperatorItem = new RepeaterItem(rptItem.ItemIndex, ListItemType.Separator); LiteralControl ltrHR = new LiteralControl(); ltrHR.Text = "
"; seperatorItem.Controls.Add(ltrHR); } StringBuilder sb = new StringBuilder(); StringWriter sw = new StringWriter(sb); HtmlTextWriter writer = new HtmlTextWriter(sw); rptDuties.RenderControl(writer); return sb.ToString(); }

您不能将Repeater控件呈现为字符串。 相反,您需要将Repeater添加到dvUserExperience作为控件。

 private void CreateUserExperienceTable(List experiences) { foreach (UserExperience experience in experiences) { ... dvUserExperience.Controls.Add(experienceTable); // Add as a server control Repeater rptDuties = updatePageWithDuties(experience.Duties); dvUserExperience.Controls.Add(rptDuties); } } private Repeater updatePageWithDuties(List list) { Repeater rptDuties = new Repeater(); ... return rptDuties; } 

更新:

您需要向RepeaterItem添加控件,即rptItem

请参阅以下代码中的箭头<=====

 private Repeater updatePageWithDuties(List list) { Repeater rptDuties = new Repeater(); rptDuties.DataSource = list; rptDuties.DataBind(); foreach (RepeaterItem rptItem in rptDuties.Items) { if (rptItem.ItemIndex == 0) { var h4Tag = new HtmlGenericControl("h4"); h4Tag.InnerHtml = "Duties"; rptItem.Controls.Add(h4Tag); <===== } var dutyLabel = new Label(); ExperienceDuties expDuties = ((IList) rptDuties.DataSource)[rptItem.ItemIndex]; dutyLabel.Text = expDuties.Description; rptItem.Controls.Add(dutyLabel); <===== var ltrHR = new LiteralControl(); ltrHR.Text = "
"; rptItem.Controls.Add(ltrHR); <===== } return rptDuties; }

您的转发器不在Form控件集合中。 应该在表格中显示它。 您不必返回StringBuilder对象,而是必须使用this.Controls.Add(rptDuties);将转发器添加到窗体的控件集合中this.Controls.Add(rptDuties); 这应该是你的转发器。

更新 – 工作samle如果你想看到改变的地方,这是一个工作样本。

注意:@Win的答案是有效的。 您应该这样做,并将您的中继器添加到占位符,即在这种情况下的dvUserExperience DIV。

标记代码

 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TestRepeater.aspx.cs" Inherits="ExcelUpload.TestRepeater" %>       

代码背后

 using System; using System.Collections.Generic; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; namespace ExcelUpload { public partial class TestRepeater : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { CreateUserExperienceTable(LoadData()); } private List LoadData() { List experiences = new List(); for (int i = 0; i < 5; i++) { UserExperience newExp = new UserExperience(); newExp.Company = "Company " + i; newExp.Role = "Role " + i; newExp.CompanyDescription = "CompanyDescription " + i; newExp.PeriodFrom = DateTime.Now.AddDays(i); newExp.PeriodTo = DateTime.Now.AddDays(i + 5); for (int j = 0; j < 2; j++) { ExperienceDuties newDuty = new ExperienceDuties(); newDuty.Description = "Duty Description " + j; newExp.Duties.Add(newDuty); } experiences.Add(newExp); } return experiences; } private void CreateUserExperienceTable(List experiences) { foreach (UserExperience experience in experiences) { HtmlGenericControl Header = new HtmlGenericControl("h3"); Header.InnerHtml = experience.Company; dvUserExperience.Controls.Add(Header); Table experienceTable = new Table(); TableRow experienceRoleRow = new TableRow(); TableRow experienceDescriptionRow = new TableRow(); TableRow experiencePeriodFromRow = new TableRow(); TableRow experiencePeriodToRow = new TableRow(); TableCell experienceRoleTitleCell = new TableCell(); TableCell experienceRoleValueCell = new TableCell(); TableCell experienceDescriptionTitleCell = new TableCell(); TableCell experienceDescriptionValueCell = new TableCell(); TableCell experiencePeriodFromTitleCell = new TableCell(); TableCell experiencePeriodFromValueCell = new TableCell(); TableCell experiencePeriodToTitleCell = new TableCell(); TableCell experiencePeriodToValueCell = new TableCell(); experienceRoleTitleCell.Text = "Role:"; experienceRoleValueCell.Text = experience.Role; experienceDescriptionTitleCell.Text = "Description:"; experienceDescriptionValueCell.Text = experience.CompanyDescription; experiencePeriodFromTitleCell.Text = "Period From: "; experiencePeriodFromValueCell.Text = experience.PeriodFrom.ToString("yy-mm-dd"); experiencePeriodToTitleCell.Text = "Period To:"; experiencePeriodToValueCell.Text = experience.PeriodTo == null ? "Present" : experience.PeriodTo.ToString(); experienceRoleRow.Cells.Add(experienceRoleTitleCell); experienceRoleRow.Cells.Add(experienceRoleValueCell); experienceDescriptionRow.Cells.Add(experienceDescriptionTitleCell); experienceDescriptionRow.Cells.Add(experienceDescriptionValueCell); experiencePeriodFromRow.Cells.Add(experiencePeriodFromTitleCell); experiencePeriodFromRow.Cells.Add(experiencePeriodFromValueCell); experiencePeriodToRow.Cells.Add(experiencePeriodToTitleCell); experiencePeriodToRow.Cells.Add(experiencePeriodToValueCell); experienceTable.Rows.Add(experienceRoleRow); experienceTable.Rows.Add(experienceDescriptionRow); experienceTable.Rows.Add(experiencePeriodFromRow); experienceTable.Rows.Add(experiencePeriodToRow); dvUserExperience.Controls.Add(experienceTable); updatePageWithDuties(experience.Duties); } } private void updatePageWithDuties(List list) { Repeater rptDuties = new Repeater(); rptDuties.ID = "rptDuties"; rptDuties.DataSource = list; rptDuties.DataBind(); foreach (RepeaterItem rptItem in rptDuties.Items) { if (rptItem.ItemIndex == 0) { RepeaterItem headerTemplate = new RepeaterItem(rptItem.ItemIndex, ListItemType.Header); HtmlGenericControl h4Tag = new HtmlGenericControl("h4"); h4Tag.InnerHtml = "Duties"; rptItem.Controls.Add(h4Tag); } RepeaterItem itemTemplate = new RepeaterItem(rptItem.ItemIndex, ListItemType.Item); Label dutyLabel = new Label(); ExperienceDuties expDuties = ((IList)rptDuties.DataSource)[rptItem.ItemIndex]; dutyLabel.Text = expDuties.Description; rptItem.Controls.Add(dutyLabel); RepeaterItem seperatorItem = new RepeaterItem(rptItem.ItemIndex, ListItemType.Separator); LiteralControl ltrHR = new LiteralControl(); ltrHR.Text = "
"; rptItem.Controls.Add(ltrHR); } dvUserExperience.Controls.Add(rptDuties); } } public class UserExperience { public List
Duties = new List(); public string Company { get; set; } public string Role { get; set; } public string CompanyDescription { get; set; } public DateTime PeriodFrom { get; set; } public DateTime PeriodTo { get; set; } } public class ExperienceDuties { public string Description { get; set; } } }