2010-04-13 51 views
4

我想開發一個非常簡單的類似於GridView的模板自定義服務器控件。基本上,我想在.aspx頁面要添加的控制是這樣的:如何構建像DataBound模板的自定義ASP.NET服務器控件的GridView

<cc:SimpleGrid ID="SimpleGrid1" runat="server"> 
     <TemplatedColumn>ID: <%# Eval("ID") %></ TemplatedColumn> 
     <TemplatedColumn>Name: <%# Eval("Name") %></ TemplatedColumn> 
     <TemplatedColumn>Age: <%# Eval("Age") %></ TemplatedColumn> 
    </cc:SimpleGrid> 

,並提供以下數據源時:

DataTable table = new DataTable(); 
    table.Columns.Add("ID", typeof(int)); 
    table.Columns.Add("Name", typeof(string)); 
    table.Columns.Add("Age", typeof(int)); 

    table.Rows.Add(1, "Bob", 35); 
    table.Rows.Add(2, "Sam", 44); 
    table.Rows.Add(3, "Ann", 26); 

    SimpleGrid1.DataSource = table; 
    SimpleGrid1.DataBind(); 

的結果應該是一個HTML表像這樣的。

------------------------------- 
| ID: 1 | Name: Bob | Age: 35 | 
------------------------------- 
| ID: 2 | Name: Sam | Age: 44 | 
------------------------------- 
| ID: 3 | Name: Ann | Age: 26 | 
------------------------------- 

主要問題是我無法定義TemplatedColumn。當我試圖做這樣的......

private ITemplate _TemplatedColumn; 
    [PersistenceMode(PersistenceMode.InnerProperty)] 
    [TemplateContainer(typeof(TemplatedColumnItem))] 
    [TemplateInstance(TemplateInstance.Multiple)] 
    public ITemplate TemplatedColumn 
    { 
     get { return _TemplatedColumn; } 
     set { _TemplatedColumn = value; } 
    } 

..並隨後實例中的CreateChildControls模板,我得到了下面的結果是不是我想要的:

----------- 
| Age: 35 | 
----------- 
| Age: 44 | 
----------- 
| Age: 26 | 
----------- 
  • 我知道我想實現的目標是毫無意義的,我可以使用DataGrid來實現它,但我給出了這個非常簡單的例子,因爲如果我知道如何做到這一點,我將能夠開發出我需要的控件。謝謝。

回答

1

看一看這篇文章:Building DataBound Templated Custom ASP.NET Server Controls

這是很老了,但是我想這是仍然有效。

+0

我讀過這篇文章,但它沒有幫助。本文將介紹如何使用不同模板(如ItemTemplate和HeaderTemplate)開發自定義控件,或者如何將所有內容放在一個ItemTemplate中。我的問題是,我有相同的模板多次使用,所以這篇文章沒有幫助我。 – Deyan 2010-04-13 18:58:26

0

我和你面臨同樣的問題。

經過一番搜索,我找到了一種方法去做你想做的事。這並不完美,因爲它需要爲每個列定義一個控件+模板(您給出的示例直接定義模板),但它可以工作。

//define a new property "Columns" in the grid 
//it will hold a collection of controls of type "TemplatedColumn" 
public class Grid : WebControl 
{ 
    private ColumnsCollection _columnsCollection; 
    public virtual ColumnsCollection Columns 
    { 
     get 
     { 
      if (_columnsCollection == null) 
       _columnsCollection = new ColumnsCollection(); 
      return _columnsCollection; 
     } 
    } 
} 

//define ColumnsCollection class (must implement IList) 
public class ColumnsCollection : List<TemplatedColumn> { ... } 

//define TemplatedColumn webcontrol (in this case, must have a template) 
public TemplatedColumn : WebControl 
{ 
    private ITemplate _Template; 

    [...] //attributes 
    public ITemplate Template 
    { 
     get { return _Template; } 
     set { _Template = value; } 
    } 
} 

然後,你可以這樣做:

<cc:Grid runat="server"> 
    <Columns> 
     <cc:TemplatedColumn runat="server"> 
      <Template>ID: <%# Eval("ID") %></Template> 
     </cc:TemplatedColumn> 
     <cc:TemplatedColumn runat="server"> 
      <Template>Name: <%# Eval("Name") %></Template> 
     </cc:TemplatedColumn> 
    <Columns> 
    </cc:Grid> 
-1

我知道如何從這個讓你:

DataTable table = new DataTable(); 
table.Columns.Add("ID", typeof(int)); 
table.Columns.Add("Name", typeof(string)); 
table.Columns.Add("Age", typeof(int)); 

table.Rows.Add(1, "Bob", 35); 
table.Rows.Add(2, "Sam", 44); 
table.Rows.Add(3, "Ann", 26); 

SimpleGrid1.DataSource = table; 
SimpleGrid1.DataBind(); 

這樣:

從了Itemplate
------------------------------- 
| ID: 1 | Name: Bob | Age: 35 | 
------------------------------- 
| ID: 2 | Name: Sam | Age: 44 | 
------------------------------- 
| ID: 3 | Name: Ann | Age: 26 | 
------------------------------- 

導出:

public class CustomColumnDefiner : ITemplate { ... 

爲列名和ListItemType添加一個公共字段到CustomColumnDefiner。

覆蓋該功能在CustomColumnDefiner:

void ITemplate.InstantiateIn(System.Web.UI.Control container) 

在InstantiateIn,如果成員ListItemType是ListItemType.Item,檢查列名。如果列名是Age,則將傳入標籤的值編輯爲「Age:」+傳入值。基本上是後處理列的每個單元格以添加「年齡:」部分。

在設置方面有這樣的函數:

private static TemplateField GetTemplateColumn(string sColName) 
    { 
     TemplateField templateField = new TemplateField(); 

     templateField.HeaderTemplate = new CustomColumnDefiner(ListItemType.Header, sColName); 
     templateField.ItemTemplate = new CustomColumnDefiner(ListItemType.Item, sColName); 

     return templateField; 
    } 

然後在你的aspx頁面代碼落後。

myGridView.Columns.Add(GetTemplateColumn("Age")); 

我用這種方法彎曲GridViews我的意志。它將用於從你的數據表格到你想要的html表格。它是否適合您的整體解決方案我不知道。

相關問題