<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title> Unhandled Exception : Dynamic Data</title><link>http://weblogs.asp.net/davidfowler/archive/tags/Dynamic+Data/default.aspx</link><description>Tags: Dynamic Data</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>Dynamic Data in Regular Websites/Web Applications</title><link>http://weblogs.asp.net/davidfowler/archive/2009/05/06/dynamic-data-preview-4.aspx</link><pubDate>Thu, 07 May 2009 01:33:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7075337</guid><dc:creator>davidfowl</dc:creator><slash:comments>13</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/davidfowler/rsscomments.aspx?PostID=7075337</wfw:commentRss><comments>http://weblogs.asp.net/davidfowler/archive/2009/05/06/dynamic-data-preview-4.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;Today I'm excited to share that we've released DynamicData Preview 4 on codeplex. Check out the latest bits &lt;A href="http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=27026" mce_href="http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=27026"&gt;here&lt;/A&gt;.&lt;BR&gt;&lt;BR&gt;This release is particularly interesting not only for people that have been using Dynamic Data for a while now, but anyone that has an existing application today who wants to use some of the niceties Dynamic Data offers without having to take all the &lt;STRONG&gt;junk&lt;/STRONG&gt; associated.&amp;nbsp;Take a look at the &lt;STRONG&gt;SimpleDynamicData&lt;/STRONG&gt;&amp;nbsp;project for examples.&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;&lt;U&gt;Existing Sites&lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;Here are 2 good reasons to use Dynamic Data:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;Rich model validation&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;Rich templating support via FieldTemplates&amp;nbsp;&amp;nbsp;&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P mce_keep="true"&gt;If you've ever written a data driven app in webforms using our data controls, you would have realized that we are lacking a lot when it comes to validation. You can enable all of this goodness with a magic extension method.&lt;/P&gt;
&lt;DIV style="BORDER-BOTTOM: #ccc 1px solid; BORDER-LEFT: #ccc 1px solid; PADDING-BOTTOM: 2px; PADDING-LEFT: 2px; PADDING-RIGHT: 2px; FONT-FAMILY: Consolas; BACKGROUND: black; COLOR: white; FONT-SIZE: 8pt; BORDER-TOP: #ccc 1px solid; BORDER-RIGHT: #ccc 1px solid; PADDING-TOP: 2px"&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;&lt;SPAN style="COLOR: #cda869"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: #cda869"&gt;void&lt;/SPAN&gt; Page_Init() {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;    GridView1.EnableDynamicData(&lt;FONT color=#cda869&gt;your type here&lt;/FONT&gt;);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;}&lt;/PRE&gt;&lt;!--EndFragment--&gt;&lt;/DIV&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;Note: The method requires that you pass in the type that may have annotations in order for us to read Metadata. If you're not familiar with the way annotations work in Dynamic Data then watch the videos &lt;/STRONG&gt;&lt;A href="http://www.asp.net/dynamicdata/" mce_href="http://www.asp.net/dynamicdata/"&gt;&lt;STRONG&gt;here&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt;.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;This method call enables &lt;STRONG&gt;DynamicControl&lt;/STRONG&gt;/&lt;STRONG&gt;DynamicField&lt;/STRONG&gt; to work within any of the data controls which makes use of &lt;A href="http://msdn.microsoft.com/en-us/library/cc488523.aspx" mce_href="http://msdn.microsoft.com/en-us/library/cc488523.aspx"&gt;&lt;STRONG&gt;FieldTemplates&lt;/STRONG&gt;&lt;/A&gt;, and enables the&amp;nbsp;rich validation support.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;&lt;U&gt;Making it work&lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;So we know about this magic method call and somehow calling it with a type makes it all just work. Let's walk through an example of how we would use this. Here is my model:&lt;/P&gt;
&lt;DIV style="BORDER-BOTTOM: #ccc 1px solid; BORDER-LEFT: #ccc 1px solid; PADDING-BOTTOM: 2px; PADDING-LEFT: 2px; PADDING-RIGHT: 2px; FONT-FAMILY: Consolas; BACKGROUND: black; COLOR: white; FONT-SIZE: 8pt; BORDER-TOP: #ccc 1px solid; BORDER-RIGHT: #ccc 1px solid; PADDING-TOP: 2px"&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;&lt;SPAN style="COLOR: #cda869"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #cda869"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: #9b703f"&gt;Student&lt;/SPAN&gt; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;SPAN style="COLOR: #9b703f"&gt;Required&lt;/SPAN&gt;]&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;SPAN style="COLOR: #9b703f"&gt;Range&lt;/SPAN&gt;(&lt;SPAN style="COLOR: #cf6a4c"&gt;0&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #cf6a4c"&gt;100&lt;/SPAN&gt;)]&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #cda869"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #cda869"&gt;int&lt;/SPAN&gt; Age { &lt;SPAN style="COLOR: #cda869"&gt;get&lt;/SPAN&gt;; &lt;SPAN style="COLOR: #cda869"&gt;set&lt;/SPAN&gt;; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;SPAN style="COLOR: #9b703f"&gt;Range&lt;/SPAN&gt;(&lt;SPAN style="COLOR: #cf6a4c"&gt;0.0&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #cf6a4c"&gt;4.0&lt;/SPAN&gt;)]&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #cda869"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #cda869"&gt;double&lt;/SPAN&gt; GPA { &lt;SPAN style="COLOR: #cda869"&gt;get&lt;/SPAN&gt;; &lt;SPAN style="COLOR: #cda869"&gt;set&lt;/SPAN&gt;; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;SPAN style="COLOR: #9b703f"&gt;Required&lt;/SPAN&gt;]&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #cda869"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #cda869"&gt;string&lt;/SPAN&gt; FirstName { &lt;SPAN style="COLOR: #cda869"&gt;get&lt;/SPAN&gt;; &lt;SPAN style="COLOR: #cda869"&gt;set&lt;/SPAN&gt;; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;SPAN style="COLOR: #9b703f"&gt;Required&lt;/SPAN&gt;]&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #cda869"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #cda869"&gt;string&lt;/SPAN&gt; LastName { &lt;SPAN style="COLOR: #cda869"&gt;get&lt;/SPAN&gt;; &lt;SPAN style="COLOR: #cda869"&gt;set&lt;/SPAN&gt;; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;SPAN style="COLOR: #9b703f"&gt;DisplayFormat&lt;/SPAN&gt;(DataFormatString = &lt;SPAN style="COLOR: #8f9d6a"&gt;"{0:d/M/yyyy}"&lt;/SPAN&gt;)]&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #cda869"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #9b703f"&gt;DateTime&lt;/SPAN&gt; BirthDate { &lt;SPAN style="COLOR: #cda869"&gt;get&lt;/SPAN&gt;; &lt;SPAN style="COLOR: #cda869"&gt;set&lt;/SPAN&gt;; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;
&lt;P&gt;This is the type we are going to use for metadata. Using the attributes from &lt;A href="http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx"&gt;System.ComponentModel.DataAnnotations&lt;/A&gt;&amp;nbsp;we can add useful annotations to our model that will be used for validation and display formatting. Adding these attributes allows Dynamic Data to enable the appropriate validator. i.e RangeValidator, RequiredFieldValidator etc.&lt;/P&gt;
&lt;P&gt;Now we're going to enable this on our GridView using the same method call as above in conjunction with an ObjectDataSource to complete our application:&lt;BR&gt;&lt;/P&gt;
&lt;DIV style="BORDER-BOTTOM: #ccc 1px solid; BORDER-LEFT: #ccc 1px solid; PADDING-BOTTOM: 2px; PADDING-LEFT: 2px; PADDING-RIGHT: 2px; FONT-FAMILY: Consolas; BACKGROUND: black; COLOR: white; FONT-SIZE: 8pt; BORDER-TOP: #ccc 1px solid; BORDER-RIGHT: #ccc 1px solid; PADDING-TOP: 2px"&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;&lt;SPAN style="COLOR: #cda869"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: #cda869"&gt;void&lt;/SPAN&gt; Page_Init() {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; GridView1.EnableDynamicData(&lt;SPAN style="COLOR: #cda869"&gt;typeof&lt;/SPAN&gt;(&lt;SPAN style="COLOR: #9b703f"&gt;Student&lt;/SPAN&gt;));&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;&lt;U&gt;Markup&lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;DIV style="BORDER-BOTTOM: #ccc 1px solid; BORDER-LEFT: #ccc 1px solid; PADDING-BOTTOM: 2px; PADDING-LEFT: 2px; PADDING-RIGHT: 2px; FONT-FAMILY: Consolas; BACKGROUND: black; COLOR: white; FONT-SIZE: 8pt; BORDER-TOP: #ccc 1px solid; BORDER-RIGHT: #ccc 1px solid; PADDING-TOP: 2px"&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;&amp;lt;&lt;SPAN style="COLOR: #9b703f"&gt;asp:GridView&lt;/SPAN&gt; &lt;SPAN style="COLOR: #9b703f"&gt;ID=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8f9d6a"&gt;"GridView1"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #9b703f"&gt;runat=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8f9d6a"&gt;"server"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #9b703f"&gt;DataSourceID=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8f9d6a"&gt;"ObjectDataSource1"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #9b703f"&gt;AutoGenerateEditButton=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8f9d6a"&gt;"true"&lt;/SPAN&gt;&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;SPAN style="COLOR: #9b703f"&gt;asp:GridView&lt;/SPAN&gt;&amp;gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;SPAN style="COLOR: #9b703f"&gt;asp:ObjectDataSource&lt;/SPAN&gt; &lt;SPAN style="COLOR: #9b703f"&gt;ID=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8f9d6a"&gt;"ObjectDataSource1"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #9b703f"&gt;runat=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8f9d6a"&gt;"server"&lt;/SPAN&gt; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #9b703f"&gt;DataObjectTypeName=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8f9d6a"&gt;"Student"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #9b703f"&gt;DeleteMethod=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8f9d6a"&gt;"DeleteStudent"&lt;/SPAN&gt; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #9b703f"&gt;InsertMethod=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8f9d6a"&gt;"InsertStudent"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #9b703f"&gt;SelectMethod=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8f9d6a"&gt;"GetStudents"&lt;/SPAN&gt; &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #9b703f"&gt;TypeName=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8f9d6a"&gt;"StudentsRepository"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #9b703f"&gt;UpdateMethod=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8f9d6a"&gt;"UpdateStudent"&lt;/SPAN&gt;&amp;gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px; FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;SPAN style="COLOR: #9b703f"&gt;asp:ObjectDataSource&lt;/SPAN&gt;&amp;gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;STRONG&gt;Note: Dynamic Data takes care of the Metadata not the data. You still need databind the&amp;nbsp;data control&amp;nbsp;against some data source/data source control.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Here are the results when we are editing:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://weblogs.asp.net/blogs/davidfowler/dynamic_data_grid.png" mce_href="http://weblogs.asp.net/blogs/davidfowler/dynamic_data_grid.png"&gt;&lt;IMG style="WIDTH: 927px; HEIGHT: 160px" border=0 src="http://weblogs.asp.net/blogs/davidfowler/dynamic_data_grid.png" width=1094 height=174 mce_src="http://weblogs.asp.net/blogs/davidfowler/dynamic_data_grid.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;As you can see, the attributes we specified on our Student class directly affect the grid and validation is enabled.&lt;/P&gt;
&lt;P&gt;There's more cool stuff to talk about but I'll mention those in upcoming posts. For now, download the preview and read up on Dynamic Data!&lt;/P&gt;&lt;!--EndFragment--&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7075337" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/davidfowler/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/davidfowler/archive/tags/Data+Controls/default.aspx">Data Controls</category><category domain="http://weblogs.asp.net/davidfowler/archive/tags/Dynamic+Data/default.aspx">Dynamic Data</category></item><item><title>AutoFieldGenerators</title><link>http://weblogs.asp.net/davidfowler/archive/2008/12/14/autofieldgenerator.aspx</link><pubDate>Sun, 14 Dec 2008 08:01:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6783754</guid><dc:creator>davidfowl</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/davidfowler/rsscomments.aspx?PostID=6783754</wfw:commentRss><comments>http://weblogs.asp.net/davidfowler/archive/2008/12/14/autofieldgenerator.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;In 3.5 SP1 we added new properties to GridView and DetailsView which allows the page developer to change the way AutoGenerateColumns creates its columns. This feature is well know in &lt;A href="http://www.asp.net/dynamicdata" mce_href="http://www.asp.net/dynamicdata"&gt;Dynamic Data&lt;/A&gt;, but it is not tied to this technology. Dynamic Data takes advantage of&amp;nbsp;this by looking at the meta data that users set on properties to generate columns. &lt;BR&gt;&lt;BR&gt;You too can roll your own IAutoFieldGenerator. Lets look at the interface:&lt;/P&gt;
&lt;DIV style="BORDER-BOTTOM: #ddd 1px solid; BORDER-LEFT: #ddd 1px solid; PADDING-BOTTOM: 2px; PADDING-LEFT: 2px; PADDING-RIGHT: 2px; FONT-FAMILY: Consolas; BACKGROUND: black; COLOR: white; FONT-SIZE: 10pt; BORDER-TOP: #ddd 1px solid; BORDER-RIGHT: #ddd 1px solid; PADDING-TOP: 2px"&gt;
&lt;P style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: yellow"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: yellow"&gt;interface&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;IAutoFieldGenerator&lt;/SPAN&gt; {&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;ICollection&lt;/SPAN&gt; GenerateFields(&lt;SPAN style="COLOR: #2b91af"&gt;Control&lt;/SPAN&gt; control);&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;}&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;The interface itself is pretty weird but it gets the job done. &lt;STRONG&gt;GenerateFields&lt;/STRONG&gt; takes the control that we're generating the fields for, and expects to get some ICollection of stuff back. If we&amp;nbsp;had the&amp;nbsp;chance to redo this interface we'd probaby rewrite it to be like this:&lt;/P&gt;
&lt;DIV style="BORDER-BOTTOM: #ddd 1px solid; BORDER-LEFT: #ddd 1px solid; PADDING-BOTTOM: 2px; PADDING-LEFT: 2px; PADDING-RIGHT: 2px; FONT-FAMILY: Consolas; BACKGROUND: black; COLOR: white; FONT-SIZE: 10pt; BORDER-TOP: #ddd 1px solid; BORDER-RIGHT: #ddd 1px solid; PADDING-TOP: 2px"&gt;
&lt;P style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: yellow"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: yellow"&gt;interface&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;IAutoFieldGenerator&lt;/SPAN&gt; {&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;IEnumerable&lt;/SPAN&gt;&amp;lt;&lt;SPAN style="COLOR: #2b91af"&gt;DataControlField&lt;/SPAN&gt;&amp;gt; GenerateFields(&lt;SPAN style="COLOR: #2b91af"&gt;Control&lt;/SPAN&gt; control);&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;}&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;Now it's clear what we expect to get back, but thats besides the point. Lets implement our own.&lt;BR&gt;&lt;BR&gt;&lt;/P&gt;
&lt;DIV style="BORDER-BOTTOM: #ddd 1px solid; BORDER-LEFT: #ddd 1px solid; PADDING-BOTTOM: 2px; PADDING-LEFT: 2px; PADDING-RIGHT: 2px; FONT-FAMILY: Consolas; BACKGROUND: black; COLOR: white; FONT-SIZE: 10pt; BORDER-TOP: #ddd 1px solid; BORDER-RIGHT: #ddd 1px solid; PADDING-TOP: 2px"&gt;
&lt;P style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: yellow"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: yellow"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;ColumnGenerator&lt;/SPAN&gt; : &lt;SPAN style="COLOR: #2b91af"&gt;IAutoFieldGenerator&lt;/SPAN&gt; {&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: yellow"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;IEnumerable&lt;/SPAN&gt;&amp;lt;&lt;SPAN style="COLOR: yellow"&gt;string&lt;/SPAN&gt;&amp;gt; _columns;&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: yellow"&gt;public&lt;/SPAN&gt; ColumnGenerator(&lt;SPAN style="COLOR: #2b91af"&gt;IEnumerable&lt;/SPAN&gt;&amp;lt;&lt;SPAN style="COLOR: yellow"&gt;string&lt;/SPAN&gt;&amp;gt; columns) {&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _columns = columns ?? &lt;SPAN style="COLOR: #2b91af"&gt;Enumerable&lt;/SPAN&gt;.Empty&amp;lt;&lt;SPAN style="COLOR: yellow"&gt;string&lt;/SPAN&gt;&amp;gt;();&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;}&lt;/P&gt;
&lt;P style="MARGIN: 0px" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: yellow"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;ICollection&lt;/SPAN&gt; GenerateFields(&lt;SPAN style="COLOR: #2b91af"&gt;Control&lt;/SPAN&gt; control) {&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: yellow"&gt;return&lt;/SPAN&gt; (&lt;SPAN style="COLOR: yellow"&gt;from&lt;/SPAN&gt; column &lt;SPAN style="COLOR: yellow"&gt;in&lt;/SPAN&gt; _columns&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: yellow"&gt;select&lt;/SPAN&gt; &lt;SPAN style="COLOR: yellow"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;BoundField&lt;/SPAN&gt; {&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SortExpression = column,&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HeaderText = column,&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataField = column&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }).ToArray();&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;}&lt;/P&gt;&lt;/DIV&gt;&lt;BR&gt;We're going to pass a set of column names&amp;nbsp;to our generator that just creates bound fields with the column's name. To make use of our new generator we can just set it like this:&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;GridView&lt;BR&gt;&lt;/STRONG&gt;&lt;BR&gt;
&lt;DIV style="BORDER-BOTTOM: #ddd 1px solid; BORDER-LEFT: #ddd 1px solid; PADDING-BOTTOM: 2px; PADDING-LEFT: 2px; PADDING-RIGHT: 2px; FONT-FAMILY: Consolas; BACKGROUND: black; COLOR: white; FONT-SIZE: 10pt; BORDER-TOP: #ddd 1px solid; BORDER-RIGHT: #ddd 1px solid; PADDING-TOP: 2px"&gt;
&lt;P style="MARGIN: 0px"&gt;gridView1.ColumnsGenerator = &lt;SPAN style="COLOR: yellow"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;ColumnGenerator&lt;/SPAN&gt;(Columns);&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;STRONG&gt;DetailsView&lt;/STRONG&gt;&lt;/P&gt;
&lt;DIV style="BORDER-BOTTOM: #ddd 1px solid; BORDER-LEFT: #ddd 1px solid; PADDING-BOTTOM: 2px; PADDING-LEFT: 2px; PADDING-RIGHT: 2px; FONT-FAMILY: Consolas; BACKGROUND: black; COLOR: white; FONT-SIZE: 10pt; BORDER-TOP: #ddd 1px solid; BORDER-RIGHT: #ddd 1px solid; PADDING-TOP: 2px"&gt;
&lt;P style="MARGIN: 0px"&gt;detailsView1.RowsGenerator = &lt;SPAN style="COLOR: yellow"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;ColumnGenerator&lt;/SPAN&gt;(Columns);&lt;/P&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;
&lt;P&gt;You can do alot of cool things with these generators. Some things I can think of off the top of my head:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Hide/Show columns dynamically based on metadata (like what we do with dynamic data)&lt;/LI&gt;
&lt;LI&gt;Hide/Show columns based on permissions&lt;/LI&gt;
&lt;LI&gt;Create a configurable UI that allows users to hide or show columns based on their preferences.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;I've written a sample that allows you to hide or show columns based on a selectable UI. You can download it here:&lt;BR&gt;&lt;BR&gt;&lt;A href="http://oyugjg.blu.livefilestore.com/y1pf8xrm5H8UZkhLkj1XfZ4szalx85Z8IAK7WxViSrSvdMOGBVOiQ0KBZMecFovM31f3ShTpvIrC45NQHJoIsfFcA/AutoFieldGenerator.zip?download" mce_href="http://oyugjg.blu.livefilestore.com/y1pf8xrm5H8UZkhLkj1XfZ4szalx85Z8IAK7WxViSrSvdMOGBVOiQ0KBZMecFovM31f3ShTpvIrC45NQHJoIsfFcA/AutoFieldGenerator.zip?download"&gt;AutoFieldGenerator.zip&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;Here is a screen shot of it running.&lt;BR&gt;&lt;BR&gt;&lt;A href="http://weblogs.asp.net/blogs/davidfowler/autogenerator.jpg" mce_href="http://weblogs.asp.net/blogs/davidfowler/autogenerator.jpg" blogs davidfowler autogenerator.jpg?&gt;&lt;IMG style="WIDTH: 498px; HEIGHT: 300px" border=0 src="http://weblogs.asp.net/blogs/davidfowler/autogenerator.jpg" width=498 height=300 mce_src="http://weblogs.asp.net/blogs/davidfowler/autogenerator.jpg"&gt;&lt;/A&gt;&lt;/P&gt;&lt;!--EndFragment--&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6783754" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/davidfowler/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/davidfowler/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/davidfowler/archive/tags/DataControls/default.aspx">DataControls</category><category domain="http://weblogs.asp.net/davidfowler/archive/tags/Dynamic+Data/default.aspx">Dynamic Data</category></item></channel></rss>