2011-02-07 3 views
0

간단한 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하지만 나는이 원인을 찾을 수 없습니다. 누구든지 어떤 제안이 있습니까? 이런 일이 왜

+0

그러나 이상하게도 LayoutTemplate을 프로그래밍 방식으로 작성하지 않고 대신 마크 업 파일에 LayoutTemplate을 선언하면 예상대로 작동합니다. –

답변

0

좋아, 내가 발견 - 코드는 내가 컨트롤을로드하고 그들에게 값을 할당의 FindControl을 사용하고 MyItemTemplate-> MyTableRow_DataBinding에, 모든

먼저 ... 아래에 추가됩니다. 이러한 컨트롤은 InstantiateIn 메서드에 이미 추가되었습니다. 분명히 그것은 올바른 방법이 아닙니다.

대신 DataBinding 이벤트에서 컨트롤을 만들고 올바른 값을 할당 한 다음 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); 
     } 
    } 
} 

참고로 HtmlGenericControl 이외의 다른 서버 컨트롤을 사용할 수도 있습니다. Table, TableHeaderRow, TableHeaderCell 등. 즉,이 경우에는 아무런 차이가 없었지만 주요 문제는 해결되었습니다.

관련 문제