<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://community.codesmithtools.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">.netTiers Team Blog</title><subtitle type="html" /><id>http://community.codesmithtools.com/blogs/nettiers/atom.aspx</id><link rel="alternate" type="text/html" href="http://community.codesmithtools.com/blogs/nettiers/default.aspx" /><link rel="self" type="application/atom+xml" href="http://community.codesmithtools.com/blogs/nettiers/atom.aspx" /><generator uri="http://communityserver.org" version="4.0.30619.63">Community Server</generator><updated>2006-03-09T22:36:00Z</updated><entry><title>Creating strongly typed repeater</title><link rel="alternate" type="text/html" href="/blogs/nettiers/archive/2006/10/04/Creating-strongly-typed-repeater.aspx" /><link rel="enclosure" type="application/x-zip-compressed" length="2340" href="http://community.codesmithtools.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.01.85.11/TableRepeater.zip" /><id>/blogs/nettiers/archive/2006/10/04/Creating-strongly-typed-repeater.aspx</id><published>2006-10-04T18:34:00Z</published><updated>2006-10-04T18:34:00Z</updated><content type="html">&lt;p&gt;When you develop ASP.Net application, you quickly discover that the basic ASP:Repeater is a killer control, although it looks quite dumb at first look, compared to DataList or the powerfull GridView, but actually its simplicity, and it&amp;#39;s lightness offer the flexibility required to do all those funcky stuff you only find in enterprise developpement ...&lt;/p&gt;&lt;p&gt;Ok, in this perfect world there is yet a dark side: the repeater is a late binding control and use a lot of reflection, which make things a lot more slower, and unhandy, because you do not have auto completion... So my idea was to generate some strongly typed Repeater, as part of the .netTiers framework. A repeater will be generated for each Table and View, and will work in conjunction with the actual strongly typed DataSource. &lt;/p&gt;&lt;h2&gt;Templated control&lt;/h2&gt;&lt;p&gt;To create these repeaters, we actually create a ASP.NET templated control, with the following ITemplate ( to match standard repeater), i mean &lt;strong&gt;HeaderTemplate&lt;/strong&gt;, &lt;strong&gt;ItemTemplate&lt;/strong&gt;, &lt;strong&gt;AlternatingItemTemplate&lt;/strong&gt; and &lt;strong&gt;FooterTemplate&lt;/strong&gt;. Here is the code of my repeater for a simple &amp;quot;Product&amp;quot; entity:&lt;/p&gt;&lt;div class="wlWriterEditableSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:fb73cc5f-1a1a-4229-93e9-ef26eacbfbcd" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;"&gt;&lt;pre style="color:white;"&gt;&lt;span style="color:#000000;"&gt;ParseChildren(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;)]
[ToolboxData(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;{0}:ProductRepeater runat=\&amp;quot;server\&amp;quot;&amp;gt;&amp;lt;/{0}:ProductRepeater&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)]
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; ProductRepeater : Control, System.Web.UI.INamingContainer
{
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; ProductRepeater()
{
}

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; ControlCollection Controls
{
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;
{
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;.EnsureChildControls();
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;base&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Controls;
}
}

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; ITemplate m_headerTemplate;
[Browsable(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;&lt;span style="color:#000000;"&gt;)]
[TemplateContainer(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="color:#000000;"&gt;(ProductItem))]
[PersistenceMode(PersistenceMode.InnerDefaultProperty)]
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; ITemplate HeaderTemplate
{
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; m_headerTemplate; }
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt; { m_headerTemplate &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value; }
}

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; ITemplate m_itemTemplate;
[Browsable(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;&lt;span style="color:#000000;"&gt;)]
[TemplateContainer(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="color:#000000;"&gt;(ProductItem))]
[PersistenceMode(PersistenceMode.InnerDefaultProperty)]
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; ITemplate ItemTemplate
{
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; m_itemTemplate; }
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt; { m_itemTemplate &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value; }
}


&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; ITemplate m_altenateItemTemplate;
[Browsable(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;&lt;span style="color:#000000;"&gt;)]
[TemplateContainer(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="color:#000000;"&gt;(ProductItem))]
[PersistenceMode(PersistenceMode.InnerDefaultProperty)]
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; ITemplate AlternatingItemTemplate
{
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; m_altenateItemTemplate; }
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt; { m_altenateItemTemplate &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value; }
}

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; ITemplate m_footerTemplate;
[Browsable(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;&lt;span style="color:#000000;"&gt;)]
[TemplateContainer(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="color:#000000;"&gt;(ProductItem))]
[PersistenceMode(PersistenceMode.InnerDefaultProperty)]
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; ITemplate FooterTemplate
{
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; m_footerTemplate; }
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt; { m_footerTemplate &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value; }
}

[Category(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Data&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)]
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;virtual&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; DataSourceID
{
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;
{
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (ViewState[&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;DataSourceID&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;] &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
{
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Empty;
}
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;)ViewState[&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;DataSourceID&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;];
}
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;
{
ViewState[&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;DataSourceID&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;] &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value;
}
}

System.Collections.IEnumerable m_currentView;

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Collections.IEnumerable ConnectToDataSourceView()
{
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (m_currentView &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
{
NetTiers.SQLiteDemo.Web.Data.ProductDataSource datasource &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
Control ctl &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Page.FindControl(DataSourceID);
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (ctl &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
{
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Web.HttpException(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Datasource does not exists&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
}
datasource &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; ctl &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;as&lt;/span&gt;&lt;span style="color:#000000;"&gt; NetTiers.SQLiteDemo.Web.Data.ProductDataSource;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (datasource &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
{
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Web.HttpException(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Datasource must be data control&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
}

System.Collections.IEnumerable dsv &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; datasource.GetEntityList(); &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;this.DataMember);&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (dsv &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
{
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Web.HttpException(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;View not found&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
}
m_currentView &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; dsv;
}
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; m_currentView;
}


&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; CreateChildControls()
{
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (ChildControlsCreated)
{
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
}
Controls.Clear();

System.Collections.IEnumerable datas &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; (System.Collections.IEnumerable)ConnectToDataSourceView();

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (datas &lt;/span&gt;&lt;span style="color:#000000;"&gt;!=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
{
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (m_headerTemplate &lt;/span&gt;&lt;span style="color:#000000;"&gt;!=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
{
Control headerItem &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Control();
m_headerTemplate.InstantiateIn(headerItem);
Controls.Add(headerItem);
}

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; pos &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; o &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; datas)
{
NetTiers.SQLiteDemo.Entities.Product entity &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; o &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;as&lt;/span&gt;&lt;span style="color:#000000;"&gt; NetTiers.SQLiteDemo.Entities.Product;
ProductItem container &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; ProductItem(entity);

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (m_itemTemplate &lt;/span&gt;&lt;span style="color:#000000;"&gt;!=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color:#000000;"&gt; (pos &lt;/span&gt;&lt;span style="color:#000000;"&gt;%&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;) &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
{
m_itemTemplate.InstantiateIn(container);
}
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt;
{
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (m_altenateItemTemplate &lt;/span&gt;&lt;span style="color:#000000;"&gt;!=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
{
m_altenateItemTemplate.InstantiateIn(container);
}
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (m_itemTemplate &lt;/span&gt;&lt;span style="color:#000000;"&gt;!=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
{
m_itemTemplate.InstantiateIn(container);
}
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt;
{
&lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; no template !!!&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
}
Controls.Add(container);
pos&lt;/span&gt;&lt;span style="color:#000000;"&gt;++&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
}

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (m_footerTemplate &lt;/span&gt;&lt;span style="color:#000000;"&gt;!=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
{
Control footerItem &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Control();
m_footerTemplate.InstantiateIn(footerItem);
Controls.Add(footerItem);
}
ChildControlsCreated &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
}
}

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; OnPreRender(EventArgs e)
{
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;base&lt;/span&gt;&lt;span style="color:#000000;"&gt;.DataBind();
}

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;#region&lt;/span&gt;&lt;span style="color:#000000;"&gt; Design time&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;internal&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; RenderAtDesignTime()
{
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;TODO create a designer&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
}

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;#endregion&lt;/span&gt;&lt;span style="color:#000000;"&gt;
}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;The code is a bit long but it&amp;#39;s mostly due to the templates properties. The main logic is in the two methods &amp;quot;&lt;strong&gt;ConnectToDataSourceView&lt;/strong&gt;&amp;quot; and &amp;quot;&lt;strong&gt;CreateChildControls&lt;/strong&gt;&amp;quot;. The first take the given datasourceId and search for the control in the page, then it get the entity list from it. The second a bit more tricky, it creates the children controls depending of the differents templates. Please note that for the ItemTemplate and AlternatingItemTemplate we loop on each entity, we create a container for this entity and send it to the current ITemplate to render it.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;&lt;/h2&gt;&lt;h2&gt;Strongly typed TemplateContainer&lt;/h2&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;&lt;/h2&gt;&lt;h2&gt;&lt;/h2&gt;&lt;p&gt;It&amp;#39;s probably not obvious here, but one of the most intersting stuff is the TemplateContainer attribute on the ITemplate properties: we use them to indicate the use of strongly typed template container. Here is the code of the Product Template container:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="wlWriterEditableSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:b1aff121-4f01-4986-85ee-a3caf68f6377" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;"&gt;&amp;lt;&amp;quot;&amp;gt; &lt;pre style="color:white;"&gt;&lt;span style="color:#000000;"&gt;[System.ComponentModel.ToolboxItem(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;&lt;span style="color:#000000;"&gt;)]
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; ProductItem : System.Web.UI.Control, System.Web.UI.INamingContainer
{
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; NetTiers.SQLiteDemo.Entities.Product _entity;

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; ProductItem()
: &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;base&lt;/span&gt;&lt;span style="color:#000000;"&gt;()
{ }

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; ProductItem(NetTiers.SQLiteDemo.Entities.Product entity)
: &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;base&lt;/span&gt;&lt;span style="color:#000000;"&gt;()
{
_entity &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; entity;
}

[System.ComponentModel.Bindable(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;)]
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Int64 Id
{
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; _entity.Id; }
}
[System.ComponentModel.Bindable(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;)]
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.String Name
{
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; _entity.Name; }
}
[System.ComponentModel.Bindable(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;)]
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.String Description
{
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; _entity.Description; }
}
[System.ComponentModel.Bindable(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;)]
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Int64 CategoryId
{
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; _entity.CategoryId; }
}

}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;The template container acts as a decorator, it takes our entity in the constructor, and exposes the entity properties as container properties: that the &amp;quot;magic&amp;quot; part, now we have a strongly typed Container in our web page, no more &lt;strike&gt;Container.Eval(&amp;quot;Name&amp;quot;),&lt;/strike&gt; but &lt;strong&gt;&amp;lt;%# Container.Name %&amp;gt;,&lt;/strong&gt; with full intellisense !!! and of course, no more reflection. &lt;/p&gt;&lt;h2&gt;Use the repeater&lt;/h2&gt;&lt;p&gt;as we&amp;#39;ve said the control is very friendly and offer intelisense on the child templates, and on the container properties, here is a sample of use:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="wlWriterEditableSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:6fbb9d27-e366-49f6-9e15-45a1858566dd" style="display:inline;float:none;margin:0px;padding:0px;"&gt;&lt;pre style="color:white;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;data:ProductRepeater
&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;ID&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;productRepeater1&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;
runat&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;
DataSourceID&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;productDataSource1&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;HeaderTemplate&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;h1&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;List of product&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;h1&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;HeaderTemplate&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ItemTemplate&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;b&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color:#000000;"&gt;# Container.Name &lt;/span&gt;&lt;span style="color:#000000;"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;b&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;br &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color:#000000;"&gt;# Container.Description &lt;/span&gt;&lt;span style="color:#000000;"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;hr &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;ItemTemplate&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;data:ProductRepeater&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;data:ProductDataSource
&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;ID&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;productDataSource1&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;
runat&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;
SelectMethod&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;GetAll&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;data:ProductDataSource&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Hopefully this article will help you to write some templated control. &lt;br /&gt;note: adding a typed designer would be a great improvement, will be for a next session.&lt;/p&gt;&lt;p&gt;You&amp;#39;ll find attached a zip file containing the corresponding codesmith template.&lt;/p&gt;&lt;p&gt;John Roland&lt;br /&gt;&lt;a href="http://www.serialcoder.net/"&gt;http://www.serialcoder.net/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.nettiers.com/"&gt;http://www.nettiers.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://predicatet.blogspot.com/"&gt;http://predicatet.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://community.codesmithtools.com/aggbug.aspx?PostID=18511" width="1" height="1"&gt;</content><author><name>dSquared</name><uri>http://community.codesmithtools.com/members/dSquared/default.aspx</uri></author><category term="netTiers" scheme="http://community.codesmithtools.com/blogs/nettiers/archive/tags/netTiers/default.aspx" /><category term="ASP.NET" scheme="http://community.codesmithtools.com/blogs/nettiers/archive/tags/ASP.NET/default.aspx" /></entry><entry><title>Music i like to share with you</title><link rel="alternate" type="text/html" href="/blogs/nettiers/archive/2006/04/14/12615.aspx" /><id>/blogs/nettiers/archive/2006/04/14/12615.aspx</id><published>2006-04-14T14:42:00Z</published><updated>2006-04-14T14:42:00Z</updated><content type="html">&lt;P&gt;Hi, &lt;/P&gt;
&lt;P&gt;Some ad today for some friends of mine (actually my former band) :-)&lt;/P&gt;
&lt;P&gt;if you like band like Tool, One minute Silence, Alice in chains, etc. you should get the new &lt;A href="http://www.thirdeyemachine.com/"&gt;Third Eye Machine&lt;/A&gt; album, as they have decided to offer it as a free download, get it at:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.moncompteur.com/compteurclick.php?idLink=9064"&gt;Million Reasons download&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;please feel free to post comment about the album here. and sorry for the totally off topic post, but hey, we need music to code !!!&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://community.codesmithtools.com/aggbug.aspx?PostID=12615" width="1" height="1"&gt;</content><author><name>dSquared</name><uri>http://community.codesmithtools.com/members/dSquared/default.aspx</uri></author></entry><entry><title>TList&lt;Entity&gt; (Tips and Tricks)</title><link rel="alternate" type="text/html" href="/blogs/nettiers/archive/2006/03/09/10861.aspx" /><id>/blogs/nettiers/archive/2006/03/09/10861.aspx</id><published>2006-03-10T04:36:00Z</published><updated>2006-03-10T04:36:00Z</updated><content type="html">&lt;P&gt;&lt;SPAN&gt;TList&amp;lt;Entity&amp;gt; (Tips and Tricks)&lt;BR&gt;&lt;/SPAN&gt;&lt;BR&gt;Utilizing many new features from the .Net 2 framework&amp;nbsp;(Generics, Delegate and Anonymous Methods) we were able to greatly&amp;nbsp;improve some core functionalities of the templates including Searching, Filtering and Sorting.&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;1. Find Methods&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Old Implementation&lt;/STRONG&gt;&lt;BR&gt;When using the Find method in .netTeirs 1, the entity search&amp;nbsp;was done with this kind of method call:&lt;BR&gt;&lt;BR&gt;&lt;EM&gt;Method Signature:&lt;STRONG&gt; &lt;/STRONG&gt;&lt;/EM&gt;Find (EntityColumn column, object searchCriteria);&lt;BR&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Example A:&lt;/STRONG&gt; &lt;BR&gt;ProductCollection productCollection = products.Find(ProductColumn.ProductId, 1); &lt;/P&gt;
&lt;P&gt;this looks very&amp;nbsp;clean but actually it's&amp;nbsp;mostly inefficient (try it in a 100x loop, with a 1000 item list ;-) the reason is that it use internally reflection to get the right property and its value, and then do the comparison.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;New Implementation&lt;/STRONG&gt;&lt;BR&gt;In .netTiers2, the Find method has a new overload that take a generic delegate as parameter.&lt;BR&gt;&lt;EM&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Method Signature:&lt;STRONG&gt; &lt;/STRONG&gt;&lt;/EM&gt;Find(Predicate&amp;lt;T&amp;gt; match);&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Example B:&lt;BR&gt;&lt;/STRONG&gt;TList&amp;lt;Product&amp;gt; products = DataRepository.ProductProvider.GetAll(); &lt;BR&gt;&lt;BR&gt;void UpdateProductQuantity(int productId, int newQuantity)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; Product product = products.Find(delegate (Product p) {return p.ProductId == productId;});&lt;BR&gt;&amp;nbsp; product.Quantity = newQuantity;&lt;BR&gt;} &lt;/P&gt;
&lt;P&gt;See how the use of an anonymous method for the predicate allow us to use the current context (here the productId parameter of the UpdateProductQuantity method). &lt;BR&gt;To search for several items that match the predicate, just use the FindAll method.&lt;/P&gt;
&lt;P&gt;You can find more information about the Predicate Generic Delegate on &lt;A href="http://msdn2.microsoft.com/en-us/library/bfcke1bz.aspx" target=_blank&gt;msdn2&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;2. Filtering&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;The Filtering is used to filter a given list of entities, this is very usefull&amp;nbsp;when the list is binded to a visual control like the DataGridView for example.&amp;nbsp; Filtering is done by providing a set of filter criteria, which is then applied to the list.&amp;nbsp; The items that DO NOT match the criteria are removed temporarly from the collection's innerList and put in the &lt;EM&gt;FilteredItems&lt;/EM&gt; property. The filter can finally be removed by calling the RemoveFilter() method.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Old Implementation &lt;/STRONG&gt;&lt;BR&gt;In netTiers1, filtering was done like so:&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Example C:&lt;/STRONG&gt;&lt;BR&gt;products.Filter = "ProductName&amp;nbsp;= 'Sugar' AND CategoryId = 5";&amp;nbsp; &lt;/P&gt;
&lt;P&gt;While it tried to emulate a familiar SQL syntax for where clauses, a special parser was evaluating the filter expression, and then use reflection to check property value; the result was&amp;nbsp;a&amp;nbsp;very slow and very limited filtering (due to the filter parser limitations and the heavy use of reflection).&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;New Implementation&lt;/STRONG&gt;&lt;BR&gt;With the use of the new Predicate&amp;lt;T&amp;gt; overload, you can do:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Example D:&lt;/STRONG&gt;&lt;BR&gt;product.ApplyFilter(delegate(Product p) {return p.ProductName == "Sugar" &amp;amp;&amp;amp; p.CategoryId ==5;}));&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;SPAN&gt;3. Sorting&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;Following a familiar pattern now, with the help of the comparison&amp;nbsp;generic delegate.&lt;BR&gt;&lt;EM&gt;&lt;BR&gt;Method Signature:&lt;/EM&gt; Sort(Comparison&amp;lt;T&amp;gt; match);&lt;BR&gt;&lt;BR&gt;We can create more efficent and complex sorting, for example, say that we want to sort the northwind category list based on the child ProductCollection property Count.&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Example E:&lt;/STRONG&gt;&lt;BR&gt;We could do something like the following: &lt;/P&gt;
&lt;P&gt;category.Sort(MyCustomSort);&amp;nbsp; //uses the MyCustomSort delegate&lt;BR&gt;...&lt;BR&gt;public int MyCustomSort(Category c1, Category c2)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return c1.ProductCollection.Count.CompareTo(c2.ProductCollection.Count);&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;Similarly, like in the previous examples of &lt;EM&gt;Find&lt;/EM&gt; and &lt;EM&gt;Filter&lt;/EM&gt;, we could've also used an anonymous delegate.&lt;BR&gt;category.Sort(&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; MyCustomSort(Category c1, Category c2){&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; return c1.ProductCollection.Count.CompareTo(c2.ProductCollection.Count);&amp;nbsp;&lt;BR&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; });&lt;BR&gt;You can find more information about the Comparing and Generic delegates on &lt;A href="http://msdn2.microsoft.com/en-us/library/tfakywbh.aspx" target=_blank&gt;MSDN2&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN&gt;4. Action&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;This last point is dedicated to a small tip i really like :-) &lt;BR&gt;The Action generic delegate that is used on the &lt;EM&gt;ForEach &lt;/EM&gt;method of the &lt;EM&gt;TList &lt;/EM&gt;collections.&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Example F:&lt;/STRONG&gt;&lt;BR&gt;category.ProductCollection.ForEach(delegate(Product p) {Console.WriteLine(p.ProductName);});&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Example G:&lt;BR&gt;&lt;/STRONG&gt;int total = 0;&lt;BR&gt;order.OrderDetailCollection.ForEach(delegate(OrderDetail od) {total += od.Quantity * od.UnitPrice&amp;nbsp;;});&lt;/P&gt;
&lt;P&gt;You can find more information about the Action Generic Delegate on &lt;A href="http://msdn2.microsoft.com/en-us/library/018hxwa8.aspx" target=_blank&gt;MSDN2&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;That's all! &amp;nbsp; Good Luck!&lt;BR&gt;Cheers!&lt;/P&gt;
&lt;P&gt;John Roland / Robert Hinojosa - &lt;A href="http://www.nettiers.com/"&gt;NetTiers.com&lt;/A&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://community.codesmithtools.com/aggbug.aspx?PostID=10861" width="1" height="1"&gt;</content><author><name>dSquared</name><uri>http://community.codesmithtools.com/members/dSquared/default.aspx</uri></author></entry></feed>