<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Systemdoktoru.com &#187; ASP.NET Dynamic Data</title>
	<atom:link href="http://www.systemdoktoru.com/etiket/asp-net-dynamic-data/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.systemdoktoru.com</link>
	<description>Windows Linux işletim sistemlerinin bilgi deposu</description>
	<lastBuildDate>Fri, 30 Apr 2010 19:02:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>ASP.NET Dynamic Data &#8211; Gelişmiş Scaffolding</title>
		<link>http://www.systemdoktoru.com/2010/04/asp-net-dynamic-data-gelismis-scaffolding/</link>
		<comments>http://www.systemdoktoru.com/2010/04/asp-net-dynamic-data-gelismis-scaffolding/#comments</comments>
		<pubDate>Fri, 30 Apr 2010 10:43:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET Dynamic Data]]></category>
		<category><![CDATA[Gelişmiş Scaffolding]]></category>

		<guid isPermaLink="false">http://www.systemdoktoru.com/?p=31</guid>
		<description><![CDATA[Merhabalar, daha &#246;nce ASP.NET Dynamic Data(yazının devamında DD kısaltmasını kullanacağım) hakkında bazı bilgileri yayınlamıştım. Yeni bir makale konusunda d&#252;ş&#252;n&#252;rken makale konusu olarak ger&#231;ek bir DD projesinde kullanıcı tarafından gelebilecek isteklerin hızlı bir şekilde nasıl karşılanabilineceğinden bahsetmenin uygun olduğuna karar verdim. Yazılımcı g&#246;z&#252;yle değerlendirmek gerekirse kullanıcı gereksinimleri konusunda g&#246;zden ka&#231;an bir &#231;ok gereksinimi g&#246;r&#252;lmeyebilir.&#160; &#214;rneğin bir [...]]]></description>
			<content:encoded><![CDATA[<p>Merhabalar, daha &ouml;nce ASP.NET Dynamic Data(yazının devamında <strong><span class="style1"><em><span class="style2">DD</span></em></span></strong> kısaltmasını kullanacağım) hakkında bazı bilgileri yayınlamıştım. Yeni bir makale konusunda d&uuml;ş&uuml;n&uuml;rken makale konusu olarak ger&ccedil;ek bir DD projesinde kullanıcı tarafından gelebilecek isteklerin hızlı bir şekilde nasıl karşılanabilineceğinden bahsetmenin uygun olduğuna karar verdim.<br /> Yazılımcı g&ouml;z&uuml;yle değerlendirmek gerekirse kullanıcı gereksinimleri konusunda g&ouml;zden ka&ccedil;an bir &ccedil;ok gereksinimi g&ouml;r&uuml;lmeyebilir.&nbsp; &Ouml;rneğin bir tablo i&ccedil;indeki kayıtların listelenmesi yazılımcı i&ccedil;in gayet yeterlidir ancak kullanıcı g&ouml;z&uuml;yle bakıldığında her şeyin listelenmesi &ccedil;oğu zaman gereksiz olacaktır. Bu kapsamda kullanıcı isteklerine karşılık sorun &ccedil;&ouml;z&uuml;m&uuml;yle alakalı <strong><em>makalele dizisi</em></strong>nin ilkini yazmaya başlıyorum. Daha &ouml;nceki makalelerde bahsettiğim isimlendirme, bi&ccedil;imlendirme vb. gibi temel işlemlere bu makalede değinmeyeceğim.</p>
<p>Kullanıcı tarafında tablo &uuml;zerindeki her alanın(<em>column</em>) g&ouml;r&uuml;nt&uuml;lenmesi istenmeyebilir. Bazı durumlarda ise t&uuml;m kayıtların listelenmesi kullanım kolaylığı a&ccedil;ısından sıkıntılı olabilir.</p>
<p>Scaffolding tekniğiyle istenilen alanların t&uuml;m şablonlarda g&ouml;r&uuml;nt&uuml;lenmesini engelleyebiliyoruz. &Ouml;zellikle listeleme sayfalarında t&uuml;m alanların sayfada g&ouml;r&uuml;n&uuml;r halde olması yatay olarak uzayan bir sayfaya neden olur ancak bu alanları klasik scaffolding tekniği ile gizlersek diğer şablonlardanda kayboluverir.&nbsp; İşte burada asıl sorun ortaya &ccedil;ıkıyor: Gizlenen alanların kullanıcı tarafından d&uuml;zenlenmesi gerekiyorsa yada detaylı g&ouml;r&uuml;nt&uuml;leme şablonunda t&uuml;m alanların g&ouml;r&uuml;nt&uuml;lenmesi gerekiyorsa ne yapacağız?</p>
<p><span id="ctl00_ctl00_ContentPlaceHolder1_ContentPlaceHolder1_lblDetail"> </p>
<table border="0" cellspacing="1" cellpadding="1">
<tbody>
<tr>
<td>&nbsp;</td>
<td>Aletleri geliştirmek DD i&ccedil;in her zaman kazanımdır. Bu senaryoda scaffolding tekniğini sayfa şablonlarına g&ouml;re nasıl &ouml;zelleştirebileceğimizi &ouml;ğreneceğiz.</td>
</tr>
</tbody>
</table>
<p></span></p>
<p>Kullanabileceğimiz veri bileşenleri(<em>GridView, FormView, DetailsView vb.</em>) veri listeleme sırasında listeleme işlemi i&ccedil;in <strong>IAutoFieldGenerator</strong> aray&uuml;z&uuml;n&uuml; uygulayan bir sınıf ile veri alanları &uuml;zerindeki kararını verir. Varsayılan alan oluşturucularda verideki t&uuml;m alanlar DD bildirimleri uygunlandıktan sonra(<em>scaffolding gibi kısıtlamalar vb.</em>) listelenir. Yapılması gereken şey ise veri listeleme işini ger&ccedil;ekleştirme g&ouml;revini yazacağımız bir sınıfın &uuml;stlenmesidir.</p>
<p><strong>IAutoFieldGenerator aray&uuml;z&uuml;n&uuml; uygulayan sınıfımız:</strong></p>
<div class="codeBlock">
<pre style="background-color: white;"><span style="color: #0000ff;">namespace</span><span style="color: #000000;"> Eposta.Core.CustomFieldGenerator{    </span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Collections.Generic;    </span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Web.UI;    </span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Web.DynamicData;     </span><span style="color: #808080;">

    ///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Bu sınıf veri listelemesini işlemlerini    </span><span style="color: #808080;">///</span><span style="color: #008000;"> &ouml;zelleştirmek amacıyla yazılmıştır.     </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #000000;">    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> CustomColumnGenerator : IAutoFieldGenerator    {        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Veri listelemesi i&ccedil;in incelenecek        </span><span style="color: #808080;">///</span><span style="color: #008000;"> tablo değişkenini tutar        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #000000;">        </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> MetaTable mTable = </span><span style="color: #0000ff;">null</span><span style="color: #000000;">;        </span><span style="color: #0000ff;">#region</span><span style="color: #000000;"> IAutoFieldGenerator Members        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Listeleme işlemini ger&ccedil;ekleştirecek method        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="control"&gt;&lt;/param&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #000000;">        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> System.Collections.ICollection GenerateFields(Control control)        {            </span><span style="color: #008000;">// Uygun kolonların biriktirildiği koleksiyon</span><span style="color: #000000;">            List&lt;DynamicField&gt; dynFieldList = </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> List&lt;DynamicField&gt;();            </span><span style="color: #008000;">// MetaTable atanmışsa</span><span style="color: #000000;">            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (mTable != </span><span style="color: #0000ff;">null</span><span style="color: #000000;">)            {                </span><span style="color: #008000;">// Her bir MetaColumn i&ccedil;in</span><span style="color: #000000;">                </span><span style="color: #0000ff;">foreach</span><span style="color: #000000;"> (MetaColumn mColumn </span><span style="color: #0000ff;">in</span><span style="color: #000000;"> </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.mTable.Columns)                {                    </span><span style="color: #008000;">// Scaffolding ataması yapılmışsa koleksiyona eklenmesi                    // uygun değildir. Eğer bu kontrol yapılmazsa ilgili                    // alan g&ouml;r&uuml;nt&uuml;lenecektir. &Ccedil;&uuml;nk&uuml; t&uuml;m sorumluluğu almış                    // bulunuyoruz</span><span style="color: #000000;">                    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (                            !mColumn.Scaffold                        )                        </span><span style="color: #0000ff;">continue</span><span style="color: #000000;">;                     DynamicField dynField = </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> DynamicField();                    dynField.DataField = mColumn.Name;                    dynFieldList.Add(dynField);                }            }            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> dynFieldList;        }        </span><span style="color: #0000ff;">#endregion</span><span style="color: #000000;">    }}

</span></pre>
</div>
<p><span class="style4"><em>Scaffolding</em></span> tekniğini denetleyerek g&ouml;r&uuml;nt&uuml;leme işlemini &uuml;stlenen sınıfımız artık hazır. Şimdi sıra şablonlara g&ouml;re bu denetleme işlemine geldi. Varsayılan şablonlar i&ccedil;in bir enum tanımlayıp GenerateFields methodunda şablona g&ouml;rede bir denetleme yapmamız gerecektir.</p>
<div class="codeBlock">
<pre style="background-color: white;"><span style="color: #0000ff;">namespace</span><span style="color: #000000;"> Eposta.Core.Enums{    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">enum</span><span style="color: #000000;"> PageTemplateType    {        Details,        Edit,        Insert,        List,        ListDetails    }}

</span></pre>
</div>
<p>&Ouml;zelleştirme işlemlerinin uygulanabilmesi i&ccedil;in &ouml;zel bir &ouml;znitelik geliştirip bildirimlerin bu &ouml;znitelik &uuml;zerinden ger&ccedil;ekleştirmesi gerekiyor bunun i&ccedil;in aşağıdaki sınıfı kullanabiliriz.</p>
<p>[more]</p>
<div class="codeBlock">
<pre style="background-color: white;"><span style="color: #0000ff;">using</span><span style="color: #000000;"> System;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.Enums;

</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;"> Eposta.Core.CustomAttributes{    [AttributeUsage(AttributeTargets.Property)]    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> CustomHiddenColumnAttribute : Attribute    {        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> İlgili alanın gizlenmesi gereken sayfa şablonları belirleniyor        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #000000;">        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> PageTemplateType[] PageTemplateTypes { </span><span style="color: #0000ff;">get</span><span style="color: #000000;">; </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">set</span><span style="color: #000000;">; }        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Parametresiz bir constructor yazılması mecburi ancak        </span><span style="color: #808080;">///</span><span style="color: #008000;"> kullanılmaması i&ccedil;in hata fırlatılması daha uygun        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #000000;">        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> CustomHiddenColumnAttribute()        {            </span><span style="color: #0000ff;">throw</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> InvalidOperationException();        }        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Sayfa şablonlarının atama işleminin kolaylaştırılması        </span><span style="color: #808080;">///</span><span style="color: #008000;"> nedeniyle params y&ouml;ntemi kullanılmıştır. &Ouml;znitelik         </span><span style="color: #808080;">///</span><span style="color: #008000;"> tanımlamasında AllowMultiple=true atamasıda yapılabilir        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="PageTemplateParams"&gt;&lt;/param&gt;</span><span style="color: #000000;">        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> CustomHiddenColumnAttribute(</span><span style="color: #0000ff;">params</span><span style="color: #000000;"> PageTemplateType[] PageTemplateParams)        {            </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.PageTemplateTypes = PageTemplateParams;        }    }}

</span></pre>
</div>
<p>Bu &ouml;zniteliğin &ouml;rnek tanımlaması aşağıdaki gibidir. Daha &ouml;ncede belirttiğim gibi &ouml;znitelik yazmayı &ccedil;ok <span class="style4">severim</span> <img src='http://www.systemdoktoru.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Bundan b&ouml;yle sadece aşağıdaki kodu kullarak t&uuml;m kodu yazmadan işimizi halledebiliriz.</p>
<div class="codeBlock">
<pre style="background-color: white;"><span style="color: #000000;"><strong>[CustomHiddenColumn(        PageTemplateType.List, PageTemplateType.ListDetails)]</strong></span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">string</span><span style="color: #000000;"> <strong>SmtpHost</strong> { </span><span style="color: #0000ff;">get</span><span style="color: #000000;">; </span><span style="color: #0000ff;">set</span><span style="color: #000000;">; }

</span></pre>
</div>
<p>Madem bu kadar kod yazdık birde MetaColumn nesneleri i&ccedil;in genişletilmiş bir method yazarak kolonda ve şablona g&ouml;re gizlilik bildirimi yapılmışmı diye kontrol edelimki her seferinde bir yığın kod yazmaktan kurtulalım.</p>
<div class="codeBlock">
<pre style="background-color: white;"><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Linq;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.CustomAttributes.UIHint;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.CustomAttributes;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.Enums;</span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;"></span><span style="color: #808080;">///</span><span style="color: #008000;"> &Ouml;mer Faruk ZORLU</span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;"> Eposta.Core.Extentions{    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> MetaColumnExtentions    {        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Sayfa şablonuna g&ouml;re alanın gizlilik durumunu d&ouml;nderir        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="mColumn"&gt;&lt;/param&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="pTemplateType"&gt;&lt;/param&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #000000;">        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">bool</span><span style="color: #000000;"> IsHidden(</span><span style="color: #0000ff;">this</span><span style="color: #000000;"> System.Web.DynamicData.MetaColumn mColumn, PageTemplateType pTemplateType)        {            </span><span style="color: #008000;">// Kolon &uuml;zerinde atanmış ustomHiddenColumn &ouml;zniteliği alınıyor            // Eğer &ccedil;oklu tanımlama(AllowMultiple) ya izin verilmişse bir            // d&ouml;ng&uuml; i&ccedil;erisinde kontrol edilmesi gerekir</span><span style="color: #000000;">            CustomHiddenColumnAttribute chCAttr =                mColumn.Attributes.OfType&lt;CustomHiddenColumnAttribute&gt;().FirstOrDefault(); &nbsp;             </span><span style="color: #008000;">//  Herhangi bir &ouml;znitelik ataması yoksa gizli değildir</span><span style="color: #000000;">            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (chCAttr == </span><span style="color: #0000ff;">null</span><span style="color: #000000;">)                </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #0000ff;">false</span><span style="color: #000000;">;             </span><span style="color: #008000;">// İlgili alan i&ccedil;in yapılan gizlilik bildirimleri parametrede            // g&ouml;nderilmiş sayfa şablonunu i&ccedil;eriyorsa gizlidir</span><span style="color: #000000;">            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> chCAttr.PageTemplateTypes.Contains(pTemplateType);;        }    }}

</span></pre>
</div>
<p>Artık daha &ouml;nce yazdığımız alan oluşturucu sınıf &uuml;zerinde &ouml;zel gizleme yapımızı denetleyen kodlar yazabiliriz. Yukarıda yazdığımız sınıfa yeni eklenen kodlar kalın olarak yazılmıştır.</p>
<p>&nbsp;</p>
<div class="codeBlock">
<pre style="background-color: white;"><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Collections.Generic;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Web.DynamicData;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Web.UI;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.Extentions;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.Enums; </span><span style="color: #0000ff;">namespace</span><span style="color: #000000;"> Eposta.Core.CustomFieldGenerator{    </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Bu sınıf veri listelemesini işlemlerini    </span><span style="color: #808080;">///</span><span style="color: #008000;"> &ouml;zelleştirmek amacıyla yazılmıştır.     </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #000000;">    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> CustomFieldGenerator : IAutoFieldGenerator    {        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Veri listelemesi i&ccedil;in incelenecek        </span><span style="color: #808080;">///</span><span style="color: #008000;"> tablo değişkenini tutar        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #000000;">        </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> MetaTable mTable = </span><span style="color: #0000ff;">null</span><span style="color: #000000;">;

        </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> PageTemplateType pTemplateType;         </span><span style="color: #0000ff;">#region</span><span style="color: #000000;"> ctor         </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> CustomFieldGenerator(MetaTable _mTable, PageTemplateType _pTemplateType)        {            </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.mTable = _mTable;            </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.pTemplateType = _pTemplateType;        }         </span><span style="color: #0000ff;">#endregion</span><span style="color: #000000;">         </span><span style="color: #0000ff;">#region</span><span style="color: #000000;"> IAutoFieldGenerator Members        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Listeleme işlemini ger&ccedil;ekleştirecek method        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="control"&gt;&lt;/param&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #000000;">        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> System.Collections.ICollection GenerateFields(Control control)        {            </span><span style="color: #008000;">// Uygun kolonların biriktirildiği koleksiyon</span><span style="color: #000000;">            List&lt;DynamicField&gt; dynFieldList = </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> List&lt;DynamicField&gt;();            </span><span style="color: #008000;">// MetaTable atanmışsa</span><span style="color: #000000;">            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (mTable != </span><span style="color: #0000ff;">null</span><span style="color: #000000;">)            {                </span><span style="color: #008000;">// Her bir MetaColumn i&ccedil;in</span><span style="color: #000000;">                </span><span style="color: #0000ff;">foreach</span><span style="color: #000000;"> (MetaColumn mColumn </span><span style="color: #0000ff;">in</span><span style="color: #000000;"> </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.mTable.Columns)                {                    </span><span style="color: #008000;">// Scaffolding ataması yapılmışsa koleksiyona eklenmesi                    // uygun değildir. Eğer bu kontrol yapılmazsa ilgili                    // alan g&ouml;r&uuml;nt&uuml;lenecektir. &Ccedil;&uuml;nk&uuml; t&uuml;m sorumluluğu almış                    // bulunuyoruz</span><span style="color: #000000;">                    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (                            !mColumn.Scaffold                        )                        </span><span style="color: #0000ff;">continue</span><span style="color: #000000;">;                     </span><span style="color: #008000;">// List ve ListDetails şablonları i&ccedil;in IsHidden                    // genişletilmiş methodu ve IsLongString methodunu                    // kontrol ediyoruz ancak Details şablonu i&ccedil;in                    // IsLongString methodunu kontrol edip gizlersek                    // uzun metin alanlar g&ouml;r&uuml;nt&uuml;lenmeyecek yani ufak bir                    // bug oluşacaktır.</span><span style="color: #000000;">                    </span><span style="color: #0000ff;">switch</span><span style="color: #000000;"> (</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.pTemplateType)                    {                        </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> PageTemplateType.Details:                            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (mColumn.IsHidden(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.pTemplateType))                                </span><span style="color: #0000ff;">continue</span><span style="color: #000000;">; </span><span style="color: #008000;">// foreach</span><span style="color: #000000;">                            </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;                        </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> PageTemplateType.List:                            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (mColumn.IsHidden(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.pTemplateType) ||                                    mColumn.IsLongString)                                </span><span style="color: #0000ff;">continue</span><span style="color: #000000;">; </span><span style="color: #008000;">// foreach</span><span style="color: #000000;">                            </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;                        </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> PageTemplateType.ListDetails:                            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (mColumn.IsHidden(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.pTemplateType) ||                                    mColumn.IsLongString)                                </span><span style="color: #0000ff;">continue</span><span style="color: #000000;">; </span><span style="color: #008000;">// foreach</span><span style="color: #000000;">                            </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;                        </span><span style="color: #0000ff;">default</span><span style="color: #000000;">:                            </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;                    }                     </span><span style="color: #008000;">// Varsayılan şablonların haricinde uzun metinlerin                    // g&ouml;r&uuml;nt&uuml;lenmesini engellemek amacıyla bu kontrol                    // yapılıyor</span><span style="color: #000000;">                    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (mColumn.IsLongString)                        </span><span style="color: #0000ff;">continue</span><span style="color: #000000;">;                     DynamicField dynField = </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> DynamicField();                    dynField.DataField = mColumn.Name;                     dynFieldList.Add(dynField);                }            }            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> dynFieldList;        }        </span><span style="color: #0000ff;">#endregion</span><span style="color: #000000;">    }}</span></pre>
</div>
<p>Son adımında ise ilgili veri kontrol&uuml;ne veri listeleme işlemini bizim &uuml;stleneceğimizi bildirmek gerekiyor. GridView nesnesi i&ccedil;in <strong>ColumnGenerator</strong> DetailsView i&ccedil;inse <strong>RowGenerator</strong> parametresi kullanılıyor. Son haliyle <strong>List</strong>.aspx.cs ve <strong>Details</strong>.aspx.cs şablon kodları aşağıdaki gibi tanımlanmalıdır.</p>
<p>&nbsp;</p>
<p><strong>List.aspx.cs kodları:</strong></p>
<div class="codeBlock">
<pre style="background-color: white;"><span style="color: #0000ff;">using</span><span style="color: #000000;"> System;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Web.DynamicData;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.CustomFieldGenerator;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.Extentions; </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">partial</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> List : System.Web.UI.Page{    </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> MetaTable table;    </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> Page_Init(</span><span style="color: #0000ff;">object</span><span style="color: #000000;"> sender, EventArgs e)    {        DynamicDataManager1.RegisterControl(GridView1, </span><span style="color: #0000ff;">true</span><span style="color: #000000;"> </span><span style="color: #008000;">/*setSelectionFromUrl*/</span><span style="color: #000000;">);        table = GridDataSource.GetTable();        GridView1.<strong>ColumnsGenerator </strong>= </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> <strong>CustomFieldGenerator</strong>(table,<strong> Eposta.Core.Enums.PageTemplateType.List</strong>);    }    </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> Page_Load(</span><span style="color: #0000ff;">object</span><span style="color: #000000;"> sender, EventArgs e)    {        Title = table.DisplayName;        InsertHyperLink.NavigateUrl = table.GetActionPath(PageAction.Insert);         </span><span style="color: #008000;">// Disable various options if the table is readonly</span><span style="color: #000000;">        </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (table.IsReadOnly)        {            GridView1.Columns[</span><span style="color: #800080;">0</span><span style="color: #000000;">].Visible = </span><span style="color: #0000ff;">false</span><span style="color: #000000;">;            InsertHyperLink.Visible = </span><span style="color: #0000ff;">false</span><span style="color: #000000;">;        }    }    </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> OnFilterSelectedIndexChanged(</span><span style="color: #0000ff;">object</span><span style="color: #000000;"> sender, EventArgs e)    {        GridView1.PageIndex = </span><span style="color: #800080;">0</span><span style="color: #000000;">;    }}</span></pre>
</div>
<p><strong><br /> Details.aspx.cs kodları:</strong></p>
<div class="codeBlock">
<pre style="background-color: white;"><span style="color: #0000ff;">using</span><span style="color: #000000;"> System;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Linq;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Web.DynamicData;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Web.UI.WebControls;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.CustomFieldGenerator;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.CustomAttributes; </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">partial</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Details : System.Web.UI.Page {    </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> MetaTable table;    </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> Page_Init(</span><span style="color: #0000ff;">object</span><span style="color: #000000;"> sender, EventArgs e) {        DynamicDataManager1.RegisterControl(DetailsView1);    }    </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> Page_Load(</span><span style="color: #0000ff;">object</span><span style="color: #000000;"> sender, EventArgs e) {        table = DetailsDataSource.GetTable();        DetailsView1.<strong>RowsGenerator </strong>= </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> <strong>CustomFieldGenerator</strong>(table, <strong>Eposta.Core.Enums.PageTemplateType.Details</strong>);

        Title = table.DisplayName;

        ListHyperLink.NavigateUrl = table.ListActionPath;    }    </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> DetailsView1_ItemDeleted(</span><span style="color: #0000ff;">object</span><span style="color: #000000;"> sender, DetailsViewDeletedEventArgs e) {        </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (e.Exception == </span><span style="color: #0000ff;">null</span><span style="color: #000000;"> || e.ExceptionHandled) {            Response.Redirect(table.ListActionPath);        }    }}

</span></pre>
</div>
<p>&Ccedil;&ouml;z&uuml;m itibari ile Grup tablosunda yapılan tanımlalarla listeleme sayfa şablonlarında bazı alanların gizlenmesini g&uuml;ncelleme ve detaylı g&ouml;r&uuml;nt&uuml;leme sayfa şablonlarında ise kullanıcının verileri g&ouml;r&uuml;nt&uuml;lemesine ve d&uuml;zenlemesine imkan tanımış olduk. Ekran g&ouml;r&uuml;nt&uuml;leri aşağıdaki gibidir.</p>
<p><strong>G&uuml;ncelleme ekranı:</strong></p>
<p><img src="http://www.yazgelistir.com/Makaleler/Resimler/1000002433_1.jpg" alt="" width="374" height="264" /></p>
<p> <strong>Listeleme ekranı:</strong></p>
<p><img src="http://www.yazgelistir.com/Makaleler/Resimler/1000002433_2.jpg" alt="" width="493" height="271" /></p>
<p> Bir yazının daha sonuna geldik. Kullanıcı gereksinimleriyle alakalı makaleler devam edecektir. Bir sonraki makalede g&ouml;r&uuml;şmek &uuml;zere. Yaşasın <span class="style6"><strong>dinamizm</strong></span>!</p>
<p><strong>Ömer Faruk ZORLU<br /> </strong></p>
<p></span></td>
</tr>
]]></content:encoded>
			<wfw:commentRss>http://www.systemdoktoru.com/2010/04/asp-net-dynamic-data-gelismis-scaffolding/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

