Repeater ile verileri listemek yada sıralamaksort mümkün. Peki sıralamasını manuel nasıl yaparız?
Bunu gerçekleştirmek için taşıma yapmak istediğimiz tablomuza RowNumber adlı bir kolonfield ekliyoruz. Bu kolondaki değer verinin sıra numarasını temsil edecek. Taşıma işlemi ise bu numaraları değiştirmekten ibaret olacaktır.
Repeater içine sıralama olayını gerçekleştirmek için iki adet ImageButton kontrolü ekliyoruz. CommandArgument özelliğineproperty taşınacak satırın Id değerini atıyoruzset. CommandName özelliğine atanan up ve down değerleri ile de taşıma yönünü bildiriyoruz.
<td style="width: 24px; text-align: center;"> <asp:ImageButton runat="server" ID="moveup" ImageUrl="~/Images/up.png" ToolTip="Yukarı Taşı" CommandArgument='<%# Eval("Id")%>' CommandName="up" /> </td> <td style="width: 24px; text-align: center;"> <asp:ImageButton runat="server" ID="movedown" ImageUrl="~/Images/down.png" ToolTip="Aşağı Taşı" CommandArgument='<%# Eval("Id")%>' CommandName="down" /> </td>
Repeater kontrolünün ItemCommand olayıevent na aşağıdaki kodları yazarak taşıma işlemini gerçekleştiriyoruz.
using (NorthwindDataContext db = new NorthwindDataContext()) { //taşınacak verinin Id bilgisi alınıyor Guid Id = new Guid(e.CommandArgument.ToString()); //taşınacak veri OrderedProduct moveproduct = db. OrderedProducts. FirstOrDefault(p => p.Id == Id); //yeni numara hesapla int RowNumber = e.CommandName == "up" ? moveproduct.RowNumber - 1 : //yukarı ise moveproduct.RowNumber + 1; //aşağı ise //yeri değişecek veri OrderedProduct targetproduct = db. OrderedProducts. FirstOrDefault(p => p.RowNumber == RowNumber); if (e.CommandName == "up") { //yukarı taşı moveproduct.RowNumber -= 1; targetproduct.RowNumber += 1; } else if (e.CommandName == "down") { //aşağo taşı moveproduct.RowNumber += 1; targetproduct.RowNumber -= 1; } //değişiklikleri yap db.SubmitChanges(); } //tekrar listele BindData();
Daha sonra ise, ilk satırdaki Yukarı Ok u ve en alt satırdaki Aşağı Ok ImageButton'larını basit bir script kodu ile kaldırıyoruz. Bu kod sayesinde sunucuserver tarafındaki ilk kayıt mı son kayıt mı kontrolünü yapmaktan yırtıyoruz :)
<script src="Scripts/jquery-1.4.1-vsdoc.js" type="text/javascript"></script> <script type="text/javascript"> $(document).ready(function () { $("table tbody tr:first td:eq(3)").empty(); $("table tbody tr:last td:eq(4)").empty(); }); </script>
Repeater kontrolü renderHtml koduna dönüşmek edildiğinde aşağıdaki görüntü oluşacaktır. Kullanıcı yukarı aşağı ok tuşları ile satırları manuel olarak sıralayabilecek.
Projeyi indir.
Pivot hazırlamak benim için hep eziyet olmuştur (Sql ile). Lakin Linq ile çok daha basitmiş onu kavradım :)
Şöyleki; Diagramda görüldüğü gibi bir yapı olsun. Yazılar ve Kategoriler adlı iki adet ana tablo ve bunları bağlayan bir adet yardımcı tablo.
Amacımız; Kategori bazında 2010 yılında aylık kaç adet yazı yayınlanmış onu bulmak ve listelemek.
from p in db.EntryCategories where p.Entry.EntryTime.Year == 2010 group p by p.Category.CategoryName into g select new { Kategori = g.Key, Ocak = g.Where(t => t.Entry.EntryTime.Month == 1).Count(), Şubat = g.Where(t => t.Entry.EntryTime.Month == 2).Count(), Mart = g.Where(t => t.Entry.EntryTime.Month == 3).Count(), Nisan = g.Where(t => t.Entry.EntryTime.Month == 4).Count(), Mayıs = g.Where(t => t.Entry.EntryTime.Month == 5).Count(), Haziran = g.Where(t => t.Entry.EntryTime.Month == 6).Count(), Temmuz = g.Where(t => t.Entry.EntryTime.Month == 7).Count(), Ağustos = g.Where(t => t.Entry.EntryTime.Month == 8).Count(), Eylül = g.Where(t => t.Entry.EntryTime.Month == 9).Count(), Ekim = g.Where(t => t.Entry.EntryTime.Month == 10).Count(), Kasım = g.Where(t => t.Entry.EntryTime.Month == 11).Count(), Aralık = g.Where(t => t.Entry.EntryTime.Month == 12).Count(), };
Sonuç;
Sayfanın CacheÖnBellek lenmesini engellemek için Head içine;
<meta http-equiv="Pragma" content="no-cache" /> <meta http-equiv="Expires" content="-1" />
Decimal kadar büyük Integer kadar tam değer saklamak isterseniz alın size BigInteger. Baştan ifade edeyim bu bir Buit-in TypeYerleşik Tip değil bir StructYapı dır ve sadece .Net Framework 4.0 ile kullanabilirsiniz.
Son olarak, bu yapıyı kullanabilmek için System.Numerics namespace ini referans olarak projenize eklemeniz gerekir.
class Program { static void Main(string[] args) { //en büyük decimal değer decimal dec = decimal.MaxValue; //decimal değerden biginteger oluşturalım BigInteger big = new BigInteger(dec); //ekranda gösterelim Console.WriteLine("dec={0}\nbig={1}", dec, big); //bir arttıralım big++; //bakalım artmış mı? Console.WriteLine("\nbig={0}", big);
//Math sınıfı kullanılamadığı için BigInteger max1 = Math.Max(big1, big2); //kendi metotları mevcut BigInteger max2 = BigInteger.Max(big1, big2);