Repeater İle Satır Taşıma

22 Şubat Salı, 2011 | Ado.Net Asp.net Linq /*Yorumlar (6)*/

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.

Yorumlar

serdar

Güzel makale sağolun yalnız proje indirme linklerinde sorun var bilginize.

11 Mart Cuma, 2011

serdar


mrb

int RowNumber = e.CommandName == "Up" ?
moveTablo .RowNumber - 1 :
moveTablo .RowNumber + 1;

Cannot implicitly convert type 'int?' to 'int'

hatası alıyorum cast etmemi söylüyor string değer ataması var yinede int'e cast etmeye calısıyorum olmuyor. Ben gelen
id'yi

int id = Convert.ToInt32(e.CommandArgument); şeklinde aldım

tablodaki değer kontrolüde bu şekil.
tblTablo moveTablo = data.tblTAblo.FirstOrDefault(a => a.TabloID == id);

a.TabloID int değerinde.

sorun nerde anlamış değilim yardımcı olursanız sevinirim iyi çalışmalar.

11 Mart Cuma, 2011

Emre AYRILMAZ

Selam,
sanırım oluşturduğunuz RowNumber alanı NULL olabilen bir alan. Eğer öyle ise;
moveTablo.RowNumber.Value - 1, şeklinde deneyin yada NULL işaretini kaldırın (zaten bu olası değil)

13 Mart Pazar, 2011

serdar

sağolun çok işime yaradı.

15 Mart Salı, 2011

serdar

mrb repeater sıra tasıma ile ilgili soru sormak istiyorum sizce nasıl olabilir ?

1
2
3 x
4 x
5

3 ve 4 sırada bulunan verileri sildim varsıyorum. Sildikten sonraki sıramala ise

1
2
5 olucaktır işlem olarak

peki 5'nolu sırayı bir üste taşımak istediğimde "-1" 2'nolu sırayı ise "+1" yapacağı için hata alıcaktır muhtemelen. alıyorumda zaten :) hata olarak
"Object reference not set to an instance of an object."
"nesne başvurusu bir nesnenin örneğine ayarlamadı gibi"
neden hata alıyor olabilirim?

sizce nasıl olmalı yardımcı olursanız sevinirim iyi günler.
 

6 Nisan Çarşamba, 2011

Emre AYRILMAZ

Selam,
aklıma ilk gelen şey;
silme işleminden sonra bir procedure çalıştırıp taşıma için kullandığın alanı tekrar sıralamak.

10 Nisan Pazar, 2011

Yorum Yaz

Ad

Email (sahte adresli yorumlar silinir.)

Yorum