<?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>Kaya BÜYÜKÇELEN &#187; pager</title>
	<atom:link href="http://www.kayabuyukcelen.com.tr/blog/tag/pager/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.kayabuyukcelen.com.tr/blog</link>
	<description>mutluluk motor sesidir...</description>
	<lastBuildDate>Sat, 07 Aug 2010 01:56:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Asp.NET DataList, PagedDataSource, DataTable ve Cache&#8230; Ajax da olursa tadından yenmez.</title>
		<link>http://www.kayabuyukcelen.com.tr/blog/aspnet-datalist-pageddatasource-datatable-ve-cache-ajax-da-olursa-tadindan-yenmez/</link>
		<comments>http://www.kayabuyukcelen.com.tr/blog/aspnet-datalist-pageddatasource-datatable-ve-cache-ajax-da-olursa-tadindan-yenmez/#comments</comments>
		<pubDate>Wed, 13 Aug 2008 21:45:38 +0000</pubDate>
		<dc:creator>Kaya Büyükçelen</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[datalist]]></category>
		<category><![CDATA[pageddatasource]]></category>
		<category><![CDATA[pager]]></category>

		<guid isPermaLink="false">http://www.buyukcelen.com/?p=35</guid>
		<description><![CDATA[DataGridView&#8217;da ki gibi paging yapmak istiyoruz elimizdeki datalist&#8217;e.  Dünya kadar hesap kitap işlerinin yanısıra; Microsoft SQL Server da MySQL&#8217;de olan LIMIT fonksiyonu yok. Hep yakınırım bundan. MySQL de paging sırasında LIMIT 20,10 dediğimiz zaman 20. satır dan başla 10 adet getir diyebiliyoduk. Bunun Microsoft SQL Server&#8217;da ki karşılığı upuzun sql kodları. Row numaralarını alacaksın da [...]]]></description>
			<content:encoded><![CDATA[<p>DataGridView&#8217;da ki gibi paging yapmak istiyoruz elimizdeki datalist&#8217;e.  Dünya kadar hesap kitap işlerinin yanısıra; Microsoft SQL Server da MySQL&#8217;de olan LIMIT fonksiyonu yok. Hep yakınırım bundan. MySQL de paging sırasında LIMIT 20,10 dediğimiz zaman 20. satır dan başla 10 adet getir diyebiliyoduk. Bunun Microsoft SQL Server&#8217;da ki karşılığı upuzun sql kodları. Row numaralarını alacaksın da onları bi satıra atacaksın da between ile çekeceksin de ölme eşşeğim ölme <img src='http://www.kayabuyukcelen.com.tr/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>PagedDataSource&#8217;u kullanabilmek için elimizdeki tüm satırları vermemiz gerekiyor. Bu da sunucuyu cidden yoran bir işlem. Öteki türlü elle vermek gerekiyor herşeyi. Alternatif çözümlerden birisi de; PagedDataSource&#8217;a bağladığımız DataTable&#8217; ı cachelemek. Cache derken tüm sayfayı değil. sadece DataTable&#8217;ı cachelemek. Akla hemen şu soru geliyor. Kategorilere göre ürün listeleten bir sayfam var. Datatable ı cache lerse hangi kategoriye girsin o süre boyunca aynı kategoriyi gösterir.</p>
<p>Eğer; Cache[KategoriID.ToString()] gibi birşey kullanırsak yada Cache["Kategori" + KategoriID.ToString()] o kategoriID ye göre datatable ımızı cacheleriz. evet bolca ram götüren bir işlem. Fakat özellikle çok tablo, çok sorgu ile çalıştığı zaman gerçekten çok süratli çalışıyor.</p>
<p>Yapacağımız örnekte KonuID&#8217;ye göre cache ledim.<br />
KonuID değişkenini viewstate de arıyor. yoksa querystring de bakıyor. oradada yoksa 1 döndürüyor.(debugging sırasındaki üşengeçliğim için 1 döndürüyor <img src='http://www.kayabuyukcelen.com.tr/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) aynı şey currentpage için de geçerli. currentpage değişkenimiz mevcut sayfa yı tutuyor. ona göre paging yapıyor.<br />
<code>public int CurrentPage<br />
{<br />
get<br />
{<br />
object o = this.ViewState["_CurrentPage"];<br />
if (o == null)<br />
if (Request.QueryString["CurrentPage"] != null)<br />
{<br />
return Convert.ToInt32(Request.QueryString["CurrentPage"])-1;<br />
}<br />
else<br />
return 0;<br />
else<br />
return (int)o;<br />
}<br />
set<br />
{<br />
this.ViewState["_CurrentPage"] = value;<br />
}<br />
}<br />
public int KonuID<br />
{<br />
get<br />
{<br />
object o = this.ViewState["TeknikKonuID"];<br />
if (o == null)<br />
{<br />
if (Request.QueryString["TeknikKonuID"] != null)<br />
{<br />
return Convert.ToInt32(Request.QueryString["TeknikKonuID"]);<br />
}<br />
else<br />
return 1;<br />
}<br />
else<br />
return (int)o;<br />
}<br />
set<br />
{<br />
this.ViewState["TeknikKonuID"] = value;<br />
}<br />
}</code></p>
<p>Bu arada altrepeater ve ustrepeater adlı iki datalistimiz daha var. Biri üstte öteki altta <img src='http://www.kayabuyukcelen.com.tr/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Repeater olmasının sebebi runtime da button eklemem. LinkButton değil buton. Sayfa ajax olduğu için; linkbutton sayfayı komple postback yapıyor. Button un stilinden buton izlenimini kaldırabiliyorum.</p>
<p><code>protected void Listele()<br />
{<br />
PagedDataSource pagedSource = new PagedDataSource();<br />
DataTable dt;<br />
if (Cache[KonuID.ToString()] == null)<br />
{<br />
//cache de yok. oluşturalım...<br />
dt = new DataTable();<br />
}<br />
else<br />
{<br />
//cache de ki mevcut datatable ı kullanalım...<br />
dt = (DataTable)Cache.Get(KonuID.ToString());<br />
}<br />
pagedSource.DataSource = dt.DefaultView;<br />
pagedSource.AllowPaging = true;<br />
pagedSource.PageSize = 10;<br />
pagedSource.CurrentPageIndex = CurrentPage;</code></p>
<p>altRepeater.Controls.Clear();<br />
ustRepeater.Controls.Clear();<br />
if (dt.Rows.Count &lt;= 10)<br />
{<br />
altRepeater.Visible = false;<br />
ustRepeater.Visible = false;<br />
}<br />
else<br />
{<br />
altRepeater.Visible = true;<br />
ustRepeater.Visible = true;<br />
}</p>
<p>Label lbl = new Label();<br />
lbl.Text = &#8220;Sayfa: &#8220;;<br />
Label lbl2 = new Label();<br />
lbl2.Text = &#8220;Sayfa: &#8220;;<br />
ustRepeater.Controls.Add(lbl);<br />
altRepeater.Controls.Add(lbl2);<br />
ToplamSayfa = pagedSource.PageCount;<br />
for (int i = 0; i &lt; pagedSource.PageCount; i++)<br />
{<br />
if (i == CurrentPage)<br />
{<br />
Label lb = new Label();<br />
lb.Text = &#8220;<strong>&#8221; + (i + 1).ToString() + &#8220;</strong>&#8220;;<br />
Label lb2 = new Label();<br />
lb2.Text = &#8220;<strong>&#8221; + (i + 1).ToString() + &#8220;</strong>&#8220;;<br />
ustRepeater.Controls.Add(lb2);<br />
altRepeater.Controls.Add(lb);<br />
}<br />
else<br />
{<br />
Button btn = new Button();<br />
btn.Text =  (i + 1).ToString();<br />
btn.CommandName = (i).ToString();<br />
btn.Click+=new EventHandler(lb_Click);<br />
Button btn2 = new Button();<br />
btn2.Text = (i + 1).ToString();<br />
btn2.CommandName = (i).ToString();<br />
btn2.Click += new EventHandler(lb_Click);<br />
btn.BackColor = Color.White;<br />
btn.Style.Add(HtmlTextWriterStyle.TextDecoration, &#8220;underline&#8221;);<br />
btn.Style.Add(HtmlTextWriterStyle.PaddingLeft,&#8221;3px&#8221;);<br />
btn.BorderWidth = 0;<br />
btn2.Style.Add(HtmlTextWriterStyle.TextDecoration, &#8220;underline&#8221;);<br />
btn2.Style.Add(HtmlTextWriterStyle.PaddingLeft, &#8220;3px&#8221;);<br />
btn2.BorderWidth = 0;<br />
btn2.BackColor = Color.White;<br />
altRepeater.Controls.Add(btn2);<br />
ustRepeater.Controls.Add(btn);<br />
}<br />
}</p>
<p>DataList1.DataSource = pagedSource;<br />
DataList1.DataBind();<br />
}</p>
<p>protected void lb_Click(object sender, EventArgs e)<br />
{<br />
CurrentPage = Convert.ToInt32((sender as Button).CommandName);<br />
Listele();<br />
}<br />
protected void OncekiSayfa_Click(object sender, EventArgs e)<br />
{<br />
CurrentPage&#8211;;<br />
Listele();<br />
}<br />
protected void SonrakiSayfa_Click(object sender, EventArgs e)<br />
{<br />
CurrentPage++;<br />
Listele();<br />
}</p>
<p>Ve cache kullanan pagerımız hazır. Unutmamamız gereken; yeni bir ürün eklendiğinde veya listelenen birşey değiştiğinde Cache.Remove(KonuID.ToString()); ile cache den datatable ımızı silmemiz. Bu arada cache de default olarak 15 dakika kalıyor. gayet uygun bir süre.</p>
<p>Umarım uykusuzlukdan dolayı eksik yazmamışımdır.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kayabuyukcelen.com.tr/blog/aspnet-datalist-pageddatasource-datatable-ve-cache-ajax-da-olursa-tadindan-yenmez/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
