C# ID";“项目占位符”;使用自定义LayoutTemplate时不渲染

C# ID";“项目占位符”;使用自定义LayoutTemplate时不渲染,c#,asp.net,listview,placeholder,itemplate,C#,Asp.net,Listview,Placeholder,Itemplate,我创建了一个简单的ASPX页面,向页面添加了一个ListView控件,并创建了ITemplate的两个实现;一个用于LayoutTemplate,一个用于ItemTemplate。这里的诀窍是,我指定了一个要在ListView中显示的列集合,并将该集合作为参数提供给我的LayoutTemplate类。以下是全部代码(“LoadDataSource”中对“Columns.Skip(1)”的调用只是为了验证我是否可以使用任意数量的列呈现ListView): public分部类ListViewITem

我创建了一个简单的ASPX页面,向页面添加了一个ListView控件,并创建了ITemplate的两个实现;一个用于LayoutTemplate,一个用于ItemTemplate。这里的诀窍是,我指定了一个要在ListView中显示的列集合,并将该集合作为参数提供给我的LayoutTemplate类。以下是全部代码(“LoadDataSource”中对“Columns.Skip(1)”的调用只是为了验证我是否可以使用任意数量的列呈现ListView):

public分部类ListViewITemplate:System.Web.UI.Page
{
私有静态IList列
{
收到
{
返回新列表(){“ColumnA”、“ColumnB”、“ColumnC”、“ColumnD”、“ColumnE”};
}
}
受保护的无效页面加载(对象发送方、事件参数e)
{
DataTable DataTable=LoadDataSource();
IEnumerable columns=dataTable.columns.Cast().Select(column=>column.ColumnName);
MyListView.LayoutTemplate=新的MyLayoutTemplate(列);
MyListView.ItemTemplate=新的MyItemTemplate(列);
MyListView.DataSource=dataTable;
MyListView.DataBind();
}
私有静态数据表LoadDataSource()
{
DataTable=新的DataTable();
IEnumerable selectedColumns=Columns.Skip(1);
foreach(selectedColumns中的字符串列)
{
Add(column,typeof(string));
}
对于(int i=0;i<100;i++)
{
DataRow DataRow=dataTable.NewRow();
foreach(selectedColumns中的字符串列)
{
dataRow[列]=“数据在”+列+”+i中;
}
dataTable.Rows.Add(dataRow);
}
返回数据表;
}
}
公共类MyLayoutTemplate:ITemplate
{
私有IEnumerable列{get;set;}
公共MyLayoutTemplate(IEnumerable列)
{
列=列;
}
公共容器(控制容器)
{
HtmlTable MyHtmlTable=新的HtmlTable();
HtmlTableRow MyHtmlTableRow=新的HtmlTableRow();
MyHtmlTableRow.Attributes[“class”]=“tableheader”;
foreach(列中的字符串列)
{
HtmlTableCell MyHtmlTableCell=新的HtmlTableCell();
LinkButton MyLinkButton=新建LinkButton();
MyLinkButton.ID=“lbn”+列;
MyLinkButton.Text=列;
MyLinkButton.ToolTip=“排序依据”+列;
MyLink Button.CommandArgument=列;
Command+=newcommandeventhandler(MyLinkButton_命令);
MyHtmlTableCell.Controls.Add(MyLink按钮);
MyHtmlTableRow.Cells.Add(MyHtmlTableCell);
}
MyHtmlTable.Rows.Add(MyHtmlTableRow);
HtmlTableRow HtmlTableRow=新的HtmlTableRow();
htmlTableRow.ID=“itemPlaceholder”;
MyHtmlTable.Rows.Add(htmlTableRow);
container.Controls.Add(MyHtmlTable);
}
void MyLinkButton_命令(对象发送器,CommandEventArgs e)
{
抛出新的NotImplementedException();
}
}
公共类MyItemTemplate:ITemplate
{
私有IEnumerable列{get;set;}
公共MyItemTemplate(IEnumerable列)
{
列=列;
}
公共容器(控制容器)
{
HtmlTableRow MyHtmlTableRow=新的HtmlTableRow();
foreach(列中的字符串列)
{
HtmlTableCell MyHtmlTableCell=新的HtmlTableCell();
MyHtmlTableCell.ID=“MyHtmlTableCell”+列;
文字MyLiteral=新文字();
MyLiteral.ID=“数据”+列;
MyHtmlTableCell.Controls.Add(MyLiteral);
MyHtmlTableRow.Cells.Add(MyHtmlTableCell);
}
MyHtmlTableRow.DataBinding+=新事件处理程序(MyTableRow\u DataBinding);
container.Controls.Add(MyHtmlTableRow);
}
受保护的void MyTableRow_数据绑定(对象发送方、事件参数e)
{
HtmlTableRow MyHtmlTableRow=(HtmlTableRow)发送方;
DataRowView DataRowView=((ListViewDataItem)MyHtmlTableRow.NamingContainer).DataItem作为DataRowView;
foreach(列中的字符串列)
{
HtmlTableCell MyHtmlTableCell=(HtmlTableCell)MyHtmlTableRow.FindControl(“MyHtmlTableCell”+列);
Literal MyLiteral=(Literal)MyHtmlTableCell.FindControl(“数据”+列);
MyLiteral.Text=dataRowView[column].ToString();
}
}
}
查看具有不同列数的ListView没有问题,但每当我单击标题中的链接时,就会出现以下服务器错误,而不是MethodNotImplemented:

必须在ListView“MyListView”上指定项目占位符


我认为答案很简单,但我就是找不到原因。有人有什么建议吗?

好的,我找到了发生这种情况的原因-下面添加了代码

首先,在MyItemTemplate->MyTableRow\u数据绑定中,我使用FindControl加载控件并为其赋值。这些控件已添加到实例化方法中。显然,这不是正确的方法

相反,您需要在数据绑定事件中创建控件,分配正确的值并将它们添加到MyHtmlTableRow(发送方参数)

其次,我需要能够呈现更复杂的表设计(包括thead和tbody),因此我用HtmlGenericControl替换了HtmlTable、HtmlTableRow和HtmlTableCell,并将标记名作为参数传递,如下所示:

public partial class ListViewITemplate : System.Web.UI.Page
{
    private static IList<string> Columns
    {
        get
        {
            return new List<string>() { "ColumnA", "ColumnB", "ColumnC", "ColumnD", "ColumnE" };
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        DataTable dataTable = LoadDataSource();

        IEnumerable<string> columns = dataTable.Columns.Cast<DataColumn>().Select(column => column.ColumnName);
        MyListView.LayoutTemplate = new MyLayoutTemplate(columns);
        MyListView.ItemTemplate = new MyItemTemplate(columns);
        MyListView.DataSource = dataTable;
        MyListView.DataBind();
    }

    private static DataTable LoadDataSource()
    {
        DataTable dataTable = new DataTable();
        IEnumerable<string> selectedColumns = Columns.Skip(1);
        foreach (string column in selectedColumns)
        {
            dataTable.Columns.Add(column, typeof(string));
        }

        for (int i = 0; i < 100; i++)
        {
            DataRow dataRow = dataTable.NewRow();
            foreach (string column in selectedColumns)
            {
                dataRow[column] = "Data in " + column + " " + i;
            }

            dataTable.Rows.Add(dataRow);
        }
        return dataTable;
    }
}

public class MyLayoutTemplate : ITemplate
{
    private IEnumerable<string> Columns { get; set; }

    public MyLayoutTemplate(IEnumerable<string> columns)
    {
        Columns = columns;
    }

    public void InstantiateIn(Control container)
    {
        HtmlGenericControl MyHtmlTable = new HtmlGenericControl("table");
        HtmlGenericControl MyHtmlTableHead = new HtmlGenericControl("thead");
        HtmlGenericControl MyHtmlTableRow = new HtmlGenericControl("tr");
        foreach (string column in Columns)
        {
            HtmlGenericControl MyHtmlTableCell = new HtmlGenericControl("th");
            LinkButton MyLinkButton = new LinkButton();

            MyLinkButton.ID = "lbn" + column;
            MyLinkButton.Text = column;
            MyLinkButton.ToolTip = "Sort by " + column;
            MyLinkButton.CommandArgument = column;
            MyLinkButton.Command += new CommandEventHandler(MyLinkButton_Command);
            MyHtmlTableCell.Controls.Add(MyLinkButton);
            MyHtmlTableRow.Controls.Add(MyHtmlTableCell);
        }
        MyHtmlTableHead.Controls.Add(MyHtmlTableRow);
        MyHtmlTable.Controls.Add(MyHtmlTableHead);
        HtmlGenericControl MyHtmlTableBody = new HtmlGenericControl("tbody");
        HtmlGenericControl MyHtmlItemPlaceholderRow = new HtmlGenericControl("tr");
        MyHtmlItemPlaceholderRow.ID = "itemPlaceholder";
        MyHtmlTableBody.Controls.Add(MyHtmlItemPlaceholderRow);
        MyHtmlTable.Controls.Add(MyHtmlTableBody);

        container.Controls.Add(MyHtmlTable);
    }

    protected void MyLinkButton_Command(object sender, CommandEventArgs e)
    {
        throw new NotImplementedException();
    }
}

public class MyItemTemplate : ITemplate
{
    private IEnumerable<string> Columns { get; set; }

    public MyItemTemplate(IEnumerable<string> columns)
    {
        Columns = columns;
    }

    public void InstantiateIn(Control container)
    {
        HtmlGenericControl MyHtmlTableRow = new HtmlGenericControl("tr");

        MyHtmlTableRow.DataBinding += new EventHandler(MyTableRow_DataBinding);
        container.Controls.Add(MyHtmlTableRow);
    }

    protected void MyTableRow_DataBinding(object sender, EventArgs e)
    {
        HtmlGenericControl MyHtmlTableRow = (HtmlGenericControl)sender;
        DataRowView dataRowView = ((ListViewDataItem)MyHtmlTableRow.NamingContainer).DataItem as DataRowView;
        foreach (string column in Columns)
        {
            HtmlGenericControl MyHtmlTableCell = new HtmlGenericControl("td");
            MyHtmlTableCell.ID = "MyHtmlTableCell" + column;
            Literal MyLiteral = new Literal();
            MyLiteral.ID = "Data" + column;
            MyLiteral.Text = dataRowView[column].ToString();
            MyHtmlTableCell.Controls.Add(MyLiteral);
            MyHtmlTableRow.Controls.Add(MyHtmlTableCell);
        }
    }
}
public分部类ListViewITemplate:System.Web.UI.Page
{
私有静态IList列
{
收到
{
返回新列表(){“ColumnA”、“ColumnB”、“ColumnC”、“ColumnD”、“ColumnE”};
}
}
受保护的无效页面加载(对象发送方、事件参数e)
{
DataTable=LoadDataSource(
public partial class ListViewITemplate : System.Web.UI.Page
{
    private static IList<string> Columns
    {
        get
        {
            return new List<string>() { "ColumnA", "ColumnB", "ColumnC", "ColumnD", "ColumnE" };
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        DataTable dataTable = LoadDataSource();

        IEnumerable<string> columns = dataTable.Columns.Cast<DataColumn>().Select(column => column.ColumnName);
        MyListView.LayoutTemplate = new MyLayoutTemplate(columns);
        MyListView.ItemTemplate = new MyItemTemplate(columns);
        MyListView.DataSource = dataTable;
        MyListView.DataBind();
    }

    private static DataTable LoadDataSource()
    {
        DataTable dataTable = new DataTable();
        IEnumerable<string> selectedColumns = Columns.Skip(1);
        foreach (string column in selectedColumns)
        {
            dataTable.Columns.Add(column, typeof(string));
        }

        for (int i = 0; i < 100; i++)
        {
            DataRow dataRow = dataTable.NewRow();
            foreach (string column in selectedColumns)
            {
                dataRow[column] = "Data in " + column + " " + i;
            }

            dataTable.Rows.Add(dataRow);
        }
        return dataTable;
    }
}

public class MyLayoutTemplate : ITemplate
{
    private IEnumerable<string> Columns { get; set; }

    public MyLayoutTemplate(IEnumerable<string> columns)
    {
        Columns = columns;
    }

    public void InstantiateIn(Control container)
    {
        HtmlGenericControl MyHtmlTable = new HtmlGenericControl("table");
        HtmlGenericControl MyHtmlTableHead = new HtmlGenericControl("thead");
        HtmlGenericControl MyHtmlTableRow = new HtmlGenericControl("tr");
        foreach (string column in Columns)
        {
            HtmlGenericControl MyHtmlTableCell = new HtmlGenericControl("th");
            LinkButton MyLinkButton = new LinkButton();

            MyLinkButton.ID = "lbn" + column;
            MyLinkButton.Text = column;
            MyLinkButton.ToolTip = "Sort by " + column;
            MyLinkButton.CommandArgument = column;
            MyLinkButton.Command += new CommandEventHandler(MyLinkButton_Command);
            MyHtmlTableCell.Controls.Add(MyLinkButton);
            MyHtmlTableRow.Controls.Add(MyHtmlTableCell);
        }
        MyHtmlTableHead.Controls.Add(MyHtmlTableRow);
        MyHtmlTable.Controls.Add(MyHtmlTableHead);
        HtmlGenericControl MyHtmlTableBody = new HtmlGenericControl("tbody");
        HtmlGenericControl MyHtmlItemPlaceholderRow = new HtmlGenericControl("tr");
        MyHtmlItemPlaceholderRow.ID = "itemPlaceholder";
        MyHtmlTableBody.Controls.Add(MyHtmlItemPlaceholderRow);
        MyHtmlTable.Controls.Add(MyHtmlTableBody);

        container.Controls.Add(MyHtmlTable);
    }

    protected void MyLinkButton_Command(object sender, CommandEventArgs e)
    {
        throw new NotImplementedException();
    }
}

public class MyItemTemplate : ITemplate
{
    private IEnumerable<string> Columns { get; set; }

    public MyItemTemplate(IEnumerable<string> columns)
    {
        Columns = columns;
    }

    public void InstantiateIn(Control container)
    {
        HtmlGenericControl MyHtmlTableRow = new HtmlGenericControl("tr");

        MyHtmlTableRow.DataBinding += new EventHandler(MyTableRow_DataBinding);
        container.Controls.Add(MyHtmlTableRow);
    }

    protected void MyTableRow_DataBinding(object sender, EventArgs e)
    {
        HtmlGenericControl MyHtmlTableRow = (HtmlGenericControl)sender;
        DataRowView dataRowView = ((ListViewDataItem)MyHtmlTableRow.NamingContainer).DataItem as DataRowView;
        foreach (string column in Columns)
        {
            HtmlGenericControl MyHtmlTableCell = new HtmlGenericControl("td");
            MyHtmlTableCell.ID = "MyHtmlTableCell" + column;
            Literal MyLiteral = new Literal();
            MyLiteral.ID = "Data" + column;
            MyLiteral.Text = dataRowView[column].ToString();
            MyHtmlTableCell.Controls.Add(MyLiteral);
            MyHtmlTableRow.Controls.Add(MyHtmlTableCell);
        }
    }
}