Pregunta

He creado una página ASPX simple, agregué un control de ListView a la página y creé dos implementaciones de la placa de elementos; Uno para la placa de diseño y otra para la placa de elementos. El truco aquí es que especifique una colección de columnas que quiero mostrar en ListView y suministrando la colección como parámetro a mi clase de LayoutTemplate. Aquí está el código completo (la llamada a "columns.skip (1)" en "loadDataSource" es simplemente verificar que puedo representar la vista de lista con un número arbitrario de columnas):

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)
    {
        HtmlTable MyHtmlTable = new HtmlTable();
        HtmlTableRow MyHtmlTableRow = new HtmlTableRow();
        MyHtmlTableRow.Attributes["class"] = "tableheader";
        foreach (string column in Columns)
        {
            HtmlTableCell MyHtmlTableCell = new HtmlTableCell();
            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.Cells.Add(MyHtmlTableCell);
        }
        MyHtmlTable.Rows.Add(MyHtmlTableRow);
        HtmlTableRow htmlTableRow = new HtmlTableRow();
        htmlTableRow.ID = "itemPlaceholder";
        MyHtmlTable.Rows.Add(htmlTableRow);

        container.Controls.Add(MyHtmlTable);
    }

    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)
    {
        HtmlTableRow MyHtmlTableRow = new HtmlTableRow();

        foreach (string column in Columns)
        {
            HtmlTableCell MyHtmlTableCell = new HtmlTableCell();
            MyHtmlTableCell.ID = "MyHtmlTableCell" + column;
            Literal MyLiteral = new Literal();
            MyLiteral.ID = "Data" + column;
            MyHtmlTableCell.Controls.Add(MyLiteral);
            MyHtmlTableRow.Cells.Add(MyHtmlTableCell);
        }
        MyHtmlTableRow.DataBinding += new EventHandler(MyTableRow_DataBinding);
        container.Controls.Add(MyHtmlTableRow);
    }

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

No tengo problemas para ver la vista de lista con un número variable de columnas, pero cada vez que hago clic en el enlace en el encabezado, recibo este error del servidor en lugar de metodonaltemplement:

Se debe especificar un marcador de posición en ListView 'myListView' ...

Creo que la respuesta es sencilla, pero no puedo encontrar la causa de esto. ¿Alguien tiene alguna sugerencia?

No hay solución correcta

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top