간단한 ASPX 페이지를 만들고 페이지에 ListView 컨트롤을 추가하고 ITemplate의 두 가지 구현을 만들었습니다. 하나는 LayoutTemplate 용이고 다른 하나는 ItemTemplate 용입니다. 여기에있는 트릭은 ListView에 표시하고 컬렉션을 매개 변수로 LayoutTemplate 클래스에 제공하려는 열의 컬렉션을 지정한다는 것입니다. 여기에 전체 코드입니다 (호출을 "Columns.Skip (1)" "LoadDataSource"내가이 칼럼의 임의의 숫자로 ListView를 렌더링 할 수 있는지 확인하기 위해 단지이다) :사용자 지정 LayoutTemplate을 사용할 때 ID "itemPlaceholder"가 렌더링되지 않습니다.
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();
}
}
}
나는 아무 문제보기가 없습니다 컬럼의 수를 다양하지만 헤더에있는 링크를 클릭 할 때마다 내가 대신 MethodNotImplemented의 서버 오류 수와의 ListView : 아이템의 자리 ListView에 'MyListView'에 지정해야합니다
을 ...
대답은 생각합니다. ightforward하지만 나는이 원인을 찾을 수 없습니다. 누구든지 어떤 제안이 있습니까? 이런 일이 왜
그러나 이상하게도 LayoutTemplate을 프로그래밍 방식으로 작성하지 않고 대신 마크 업 파일에 LayoutTemplate을 선언하면 예상대로 작동합니다. –