.Net Denemeleri

Repeater İle Satır Taşıma

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.

Table

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.

Grid

Projeyi indir.

22 Şubat Salı, 2011 | Ado.Net Asp.net Linq

DropDownList Validation

Validation

2 Şubat Çarşamba, 2011 | Asp.net

Linq İle Pivot

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.

Diagram

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ç;
Table

31 Ocak Pazartesi, 2011 | Linq

No Cache

 Sayfanın CacheÖnBellek lenmesini engellemek için Head içine;

<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="-1" />
30 Ocak Pazar, 2011 | Html

Big Big BigInteger

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);

              BigInteger Result

//Math sınıfı kullanılamadığı için
BigInteger max1 = Math.Max(big1, big2);
//kendi metotları mevcut
BigInteger max2 = BigInteger.Max(big1, big2);
5 Aralık Pazar, 2010 | C#