Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用动态绑定到对象列表的ASP.NET Repeater创建HtmlTable_C#_Asp.net_Webforms - Fatal编程技术网

C# 使用动态绑定到对象列表的ASP.NET Repeater创建HtmlTable

C# 使用动态绑定到对象列表的ASP.NET Repeater创建HtmlTable,c#,asp.net,webforms,C#,Asp.net,Webforms,我正在以编程方式在中继器中创建一个表。我的问题是,项目模板部分中的单元格无法正确渲染。它们在表的标记后显示为文本节点。有人对如何正确渲染表格单元格有什么建议吗 using System; using System.Collections.Generic; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; namespace WebApplication1 { p

我正在以编程方式在中继器中创建一个表。我的问题是,项目模板部分中的单元格无法正确渲染。它们在表的标记后显示为文本节点。有人对如何正确渲染表格单元格有什么建议吗

using System;
using System.Collections.Generic;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;

namespace WebApplication1
{
    public partial class WebForm2 : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                var dogs = new List<Dog>
                {
                    new Dog { Name = "Rex", Breed = "Russell Terrier" },
                    new Dog { Name = "Fido", Breed = "Poodle" },
                    new Dog { Name = "Fetcher", Breed = "Golden Retriever" },
                };

                var repeater = new Repeater { ID = "Repeater1" };
                repeater.DataSource = dogs;
                repeater.DataBind();

                AddHeader(repeater);
                AddItems(repeater, dogs);

                PlaceHolder1.Controls.Add(repeater);
            }
        }

        private void AddHeader(Repeater repeater)
        {
            var repeaterItem = new RepeaterItem(0, ListItemType.Header);
            var table = new HtmlTable();
            var row = new HtmlTableRow();
            var cell1 = new HtmlTableCell("th") { InnerText = "Name" };
            var cell2 = new HtmlTableCell("th") { InnerText = "Breed" };
            row.Cells.Add(cell1);
            row.Cells.Add(cell2);
            table.Rows.Add(row);
            repeaterItem.Controls.Add(table);
            repeater.Controls.Add(repeaterItem);
        }

        private void AddItems(Repeater repeater, List<Dog> dogs)
        {
            for (var i = 0; i < repeater.Items.Count; i++)
            {
                var repeaterItem = new RepeaterItem(i + 1, ListItemType.Item);
                var row = new HtmlTableRow();
                var cell1 = new HtmlTableCell() { InnerText = dogs[i].Name };
                var cell2 = new HtmlTableCell() { InnerText = dogs[i].Breed };
                row.Cells.Add(cell1);
                row.Cells.Add(cell2);
                repeaterItem.Controls.Add(row);
                repeater.Controls.Add(repeaterItem);
            }
        }

        private sealed class Dog
        {
            public string Breed { get; set; }
            public string Name { get; set; }
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Web.UI;
使用System.Web.UI.HTMLControl;
使用System.Web.UI.WebControl;
命名空间WebApplication1
{
公共部分类WebForm2:第页
{
受保护的无效页面加载(对象发送方、事件参数e)
{
如果(!IsPostBack)
{
var dogs=新列表
{
新狗{Name=“Rex”,Breed=“Russell Terrier”},
新狗{Name=“Fido”,Breed=“Poodle”},
新狗{Name=“Fetcher”,Breed=“Golden Retriever”},
};
var repeater=新的中继器{ID=“Repeater1”};
repeater.DataSource=狗;
repeater.DataBind();
AddHeader(中继器);
附加项(中继器、狗);
占位符1.控件.添加(中继器);
}
}
专用void AddHeader(中继器中继器)
{
var repeaterItem=新的repeaterItem(0,ListItemType.Header);
var table=新的HtmlTable();
var row=新的HtmlTableRow();
var cell1=新的HtmlTableCell(“th”){InnerText=“Name”};
var cell2=新的HtmlTableCell(“th”){InnerText=“Breed”};
row.Cells.Add(cell1);
行。单元格。添加(单元格2);
table.Rows.Add(行);
repeaterItem.Controls.Add(表);
repeater.Controls.Add(repeaterItem);
}
专用无效附加项(中继器中继器,列表狗)
{
对于(变量i=0;i
更新:多亏了Rob的帮助,我才能够让代码正常工作。现在,我有了一个功能齐全的中继器,它完全通过数据绑定加载到代码中。很好

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using ExtensionMethods.WebControls;

namespace WebApplication1
{
    public partial class WebForm1 : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            var dogs = new List<Dog>
            {
                new Dog { Name = "Rex", Breed = "Russell Terrier" },
                new Dog { Name = "Fido", Breed = "Poodle" },
                new Dog { Name = "Fetcher", Breed = "Golden Retriever" },
            };

            var repeater = new Repeater
            {
                ID             = "Repeater1",
                HeaderTemplate = new CustomTemplate(ListItemType.Header),
                ItemTemplate   = new CustomTemplate(ListItemType.Item),
                FooterTemplate = new CustomTemplate(ListItemType.Footer),
                DataSource     = dogs
            };

            repeater.DataBind();
            PlaceHolder1.Controls.Add(repeater);
        }

        // Custom template class to add controls to the repeater's header, item and footer sections.
        private sealed class CustomTemplate : ITemplate
        {
            private ListItemType ListItemType { get; set; }

            public CustomTemplate(ListItemType type)
            {
                ListItemType = type;
            }

            public void InstantiateIn(Control container)
            {
                if (ListItemType == ListItemType.Header)
                {
                    var table = new LiteralControl();
                    var head = new HtmlGenericControl("thead");
                    var row = new HtmlTableRow();
                    row.Cells.Add(new HtmlTableCell("th") { InnerText = "Breed" });
                    row.Cells.Add(new HtmlTableCell("th") { InnerText = "Name" });
                    head.Controls.Add(row);
                    table.Text = string.Format("<table>{0}<tbody>", head.RenderHtml());
                    container.Controls.Add(table);
                }
                else if (ListItemType == ListItemType.Item)
                {
                    var row = new HtmlTableRow();

                    var cell1 = new HtmlTableCell();
                    cell1.Controls.Add(new Literal { ID = "LiteralBreed" });
                    row.Cells.Add(cell1);

                    var cell2 = new HtmlTableCell();
                    cell2.Controls.Add(new Literal { ID = "LiteralName" });
                    row.Cells.Add(cell2);

                    container.Controls.Add(row);
                    container.DataBinding += new EventHandler(Container_DataBinding);
                }
                else if (ListItemType == ListItemType.Footer)
                {
                    var footer = new LiteralControl("</tbody></table>");
                    container.Controls.Add(footer);
                }
            }

            // Event handler to populate the dog's breed and name in the table when data-binding occurs.
            private void Container_DataBinding(object sender, EventArgs e)
            {
                var item = sender as RepeaterItem;
                if (item != null)
                {
                    var dog = ((Dog)item.DataItem);

                    var breed = item.FindDescendantsByType<Literal>().Single(x => x.ID == "LiteralBreed");
                    breed.Text = dog.Breed;

                    var name = item.FindDescendantsByType<Literal>().Single(x => x.ID == "LiteralName");
                    name.Text = dog.Name;
                }
            }
        }

        private sealed class Dog
        {
            public string Breed { get; set; }
            public string Name { get; set; }
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web.UI;
使用System.Web.UI.HTMLControl;
使用System.Web.UI.WebControl;
使用ExtensionMethods.WebControls;
命名空间WebApplication1
{
公共部分类WebForm1:第页
{
受保护的无效页面加载(对象发送方、事件参数e)
{
var dogs=新列表
{
新狗{Name=“Rex”,Breed=“Russell Terrier”},
新狗{Name=“Fido”,Breed=“Poodle”},
新狗{Name=“Fetcher”,Breed=“Golden Retriever”},
};
var中继器=新中继器
{
ID=“Repeater1”,
HeaderTemplate=新的CustomTemplate(ListItemType.Header),
ItemTemplate=新的CustomTemplate(ListItemType.Item),
FooterTemplate=新的CustomTemplate(ListItemType.Footer),
数据源=狗
};
repeater.DataBind();
占位符1.控件.添加(中继器);
}
//自定义模板类,用于将控件添加到转发器的页眉、项目和页脚部分。
私有密封类CustomTemplate:ITemplate
{
私有ListItemType ListItemType{get;set;}
公共自定义模板(ListItemType类型)
{
ListItemType=类型;
}
公共容器(控制容器)
{
if(ListItemType==ListItemType.Header)
{
var table=新的LiteralControl();
var head=新的HtmlGenericControl(“THAD”);
var row=新的HtmlTableRow();
添加(新的HtmlTableCell(“th”){InnerText=“Breed”});
添加(新的HtmlTableCell(“th”){InnerText=“Name”});
head.Controls.Add(行);
table.Text=string.Format(“{0}”,head.RenderHtml());
container.Controls.Add(表);
}
else if(ListItemType==ListItemType.Item)
{
var row=新的HtmlTableRow();
var cell1=新的HtmlTableCell();
cell1.Controls.Add(新文本{ID=“LiteralBreed”});
row.Cells.Add(cell1);
var cell2=新的HtmlTableCell();
cell2.Controls.Add(新文本{ID=“LiteralName”});
行。单元格。添加(单元格2);
container.Controls.Add(行);
container.DataBinding+=新事件处理程序(container\u DataBinding);
}
else if(ListItemType==ListItemType.Footer)
{
var footer=新的LiteralControl(“”);
container.Controls.Add(页脚);
}
}
//事件处理程序,用于在数据绑定发生时在表中填充狗的品种和名称。
私有无效容器\u数据绑定(对象发送方、事件参数e)
{
var item=发送方作为RepeaterItem;
<table>
<tbody><tr>
    <th>Name</th>
    <th>Breed</th>
</tr></tbody>
</table>
<table>
    <tbody>
        <asp:Repeater ID="fooRepeater" runat="server" ></asp:Repeater>
    </tbody>       
</table>
    private void AddItems(Repeater repeater, List<Dog> dogs)
    {
        var repeaterItem = new RepeaterItem(0, ListItemType.Header);
        var table = new HtmlTable();
        var row = new HtmlTableRow();
        var cell1 = new HtmlTableCell("th") { InnerText = "Name" };
        var cell2 = new HtmlTableCell("th") { InnerText = "Breed" };
        row.Cells.Add(cell1);
        row.Cells.Add(cell2);
        table.Rows.Add(row);

        for (var i = 0; i < repeater.Items.Count; i++)
        {
            repeaterItem = new RepeaterItem(i + 1, ListItemType.Item);
            row = new HtmlTableRow();
            cell1 = new HtmlTableCell() { InnerText = dogs[i].Name };
            cell2 = new HtmlTableCell() { InnerText = dogs[i].Breed };
            row.Cells.Add(cell1);
            row.Cells.Add(cell2);

            table.Rows.Add(row);
        }

        repeaterItem.Controls.Add(table);
        repeater.Controls.Add(repeaterItem);

    }