GridView üzerinde seçili dataları silme

Text dosyasından veri okuyup gride yazacağız ve burdan seçip silme işlemini gerçekleştireceğiz...

Merhaba Arkadaşlar,

Bugün bir txt dosyasından aldığımız datalarımızı bir gridview üzerinde göstereceğiz ve bu datalardan istediğimizi seçip silme işlemine tabi tutacağız.

Bunu veritabanı ile yapmaktansa txt dosyası ile yapıyorum bu sefer.Hem değişiklik olur,bu şekilde txt dosyasına okuma,yazma ve silme gibi işlemleri de görmüş oluruz.

Öncelikle txt dosyamda kayıtları nasıl tuttuğumu gösteren bir satır kaydı aşağıda paylaşıyorum:

$2012041610515#Bogaz#16.04.2012#6#
29,036735 41,250947
29,021027 41,268339
29,073294 41,270057
29,119276 41,262542
29,132416 41,231405
29,142127 41,212712


Her satırın başında $ işareti ve her datanın arasında # işareti olmak üzere tuttuğum kayıtlar bunlar. Oradaki 6 sayısı aşağıda kaç kayıt olduğunu gösteriyor. Ben grid'de sadece başında $ olan kayıtları listeleyeğim. Ama silerken o satırlara ait alt satırları da sileceğim.

Neyse daha sonra sayfamıza bir tane gridview ekliyoruz. Ben buna dgvRota ismini verdim.Şimdi bu gridin Edit Columns özelliğinden yararlanıp aşağıdaki kolonları ekliyoruz.

ID,ROTA ADI,TARIH,NODE SAYISI (TextBox Column) ve SiL (CheckBoxColumn) olacak şekilde ekliyoruz.

Ben gridviewi page load'da dolduruyorum. Bunu yaptığım kodum aşağıdaki şekilde.


private void fillGridView() 

{

    StreamReader sr;

    dgvRota.Rows.Clear();     //öncelikle gridviewi temizleyip varolan kayıtları girdden siliyorum.

    try

    {

//Burada siz kendi dosya yolunuzu vereceksiniz,ben program gereği dosya ile exe dosyasını aynı dizinde tutuyorum.

//Dosyanın var olup olmadığını kontrol ediyorum aksi halde olmayan bir dosyadan okumaya kalktığımda hata verecektir.

        if (File.Exists("routes.txt"))         

        {

//dosya içindekileri streamReadere doldurduk.

//Daha sonra satır satır okuyup,kayıtları parse edeceğim ve gridview e dolduracağım.

            sr = new StreamReader("routes.txt"); 

            string pLine = sr.ReadLine();   //her satırı pLine değişkenime atıyorum.

            string[] arrayLine;

            int indx = 0;

            while (pLine != null)

            {

                if (Program.MySubString(pLine, 0, 1) == "$") 

                {

                    arrayLine = pLine.Split('#');

                    dgvRota.Rows.Add();   //gridview e yeni bir satır ekliyorum ve kaydımı split edip gridin ilgili kolonlarına dolduruyorum.

                    dgvRota.Rows[indx].Cells[0].Value = arrayLine[0].Split('$')[1];

                    dgvRota.Rows[indx].Cells[1].Value = arrayLine[1];

                    dgvRota.Rows[indx].Cells[2].Value = arrayLine[2];

                    dgvRota.Rows[indx].Cells[3].Value = arrayLine[3];

                    indx++;

                }

                pLine = sr.ReadLine();

            }



            sr.Close();

        }

        else

        {

            MessageBox.Show("Kayıtlı Rota Bulunamadı...");

        }

    }

    catch (Exception ex)

    {

        MessageBox.Show("Hata : " + ex.Message);

    }

}



Yukarda gridviewi doldurma kısmını anladığınızı varsayarak silme işlemlerine geçiyorum.Yukardaki işlem ile gridview txt dosyasındaki kayıtlar ile dolacak ve gridin en sonunda SiL başlığı ile checkbox lardan oluşan bir kolon olacak.Siz silmek istediğiniz kayda denk gelen checkboz u seçip sil butonuna basacak ve istediğiniz kayıtların silindiğini göreceksiniz.

Şimdi silme işlemini yapan kodlarımızı inceleyelim.


private void button1_Click(object sender, EventArgs e)

{

    string str = "";

    string[] SecilenID;

    int sAdet = 0;

//Bu for döngüsü ile silinmesi için seçilen kayıtlarımızın ID değerlerini aralarına $ işareti koyarak bir stringe atıyoruz.

    for (int i = 0; i < dgvRota.Rows.Count; i++)

    {

        if (dgvRota.Rows.Cells["sil"].Value != null)

        {

            if (((bool)dgvRota.Rows.Cells["sil"].Value) == true)

            {

                str += "$" + dgvRota.Rows.Cells[0].Value.ToString();

                sAdet++;

            }

        }

    }



    if (sAdet == 0)

    {

        MessageBox.Show("Silinecek Rotaları seçiniz...");

        return;

    }

    else

    {

//Burada seçilen kayıtların yanlışlıkla silinmemesi için kullanıcıya silmek isteyip istemediğini tekrarlıyoruz.

//Yanıt evet olması durumunda silme işlemine devam ediyoruz.

        if (MessageBox.Show(sAdet + " Adet Rota Silinecek.nOnaylıyor musunuz?", "Onay!", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)

        {

            SecilenID = str.Split('$'); //Silinecek ID leri diziye atıyoruz şimdi.

            StreamReader sReader = new StreamReader("routes.txt");

            string readLine = sReader.ReadLine();

//Bir tane temp txt dosyası olusturup öncelikle silinmeyecek olan kayıtları buraya atacağım.

//Daha sonra asıl txt dosyamı boşaltıp temp dosyamı buraya nakledeceğim.Olay bundan ibaret aslında.

            StreamWriter sWriter = File.CreateText("temproutes.txt");

            

            while (readLine != null)

            {

                string contID = Program.MySubString(readLine.Split('#')[0], 1, readLine.Length - 1);

//Buradaki IF yapısı kaydın $ ile başlayıp başlamadığını ve kontrol edilen ID nin silinmek için seçilen ID ler içerisinde olup olmadığını kontrol ediyor.

//Burada kullandığım MySubString ve  isExistInList fonksiyonlarını da aşağıda veriyor olacağım.

                if (Program.MySubString(readLine,0,1) == "$" && isExistInList(SecilenID,contID) == true)

                {

//Hatırlarsanız txt dosyasındaki en son kaydın o ilgili kayda ait,o kadar alt satırdan oluşan node sayısı olduğunu söylemiştim.

//burada eğer ID seçilen ID ler arasında ise dosyadan okuyorum (tamamen ilerleyebilmek için);ama herhangi bir işlem yapmıyorum.

                    int cnt = Convert.ToInt32(readLine.Split('#')[3]);

                    for (int j = 0; j < cnt; j++)

                    {

                        readLine = sReader.ReadLine();

                    }

                }

//Eğer seçilen ID arasında değilse,o satırla beraber node sayısı kadar alt satırı da temp txt dosyama taşıyorum.

                else if(Program.MySubString(readLine,0,1) == "$")

                {

                    sWriter.WriteLine(readLine);

                    int cnt = Convert.ToInt32(readLine.Split('#')[3]);

                    for (int j = 0; j < cnt; j++)

                    {

                        readLine = sReader.ReadLine();

                        sWriter.WriteLine(readLine);

                    }

                }

                readLine = sReader.ReadLine();

            }



            sReader.Close();

            sWriter.Flush();

            sWriter.Close();

//En sonunda asıl dosyamı silip,temp dosyamı tekrar asıl dosyam ile isimlendirip sonlandırıyorum.

            File.Delete("routes.txt");

            File.Move("temproutes.txt", "routes.txt");



            MessageBox.Show("Silme İşlemi başarılı bir şekilde yapılmıştır...");



//Burada oluşan yeni kayıtlar ile gridview imi güncelliyorum.

            fillGridView();

        }

        else

        {

            MessageBox.Show("Silme İşlemi iptal edildi...");

        }

    }

}



Yukarda kullandığım iki fonksiyonu da aşağıda bulabilirisiniz.

isExistInList fonksiyonu :


private bool isExistInList(string[] nList, string dest) 

{

    for (int i = 0; i < nList.Length; i++)

    {

        if (nList == dest)

        {

            return true;

        }

    }

    return false;

}



MySubstring Fonksiyonu :


public static string MySubString(string str,int indx,int lngt) 

{

    string newStr = str;



    if (lngt > str.Length - indx && indx < str.Length)

    {

        newStr = str.Substring(indx, str.Length - indx);

    }

    else if (indx > str.Length)

    {

        newStr = "";

    }

    else

    {

        newStr = str.Substring(indx, lngt);

    }



    return newStr;

}



Evet, elimden geldiğince yorum satırları ile açıklamaya çalıştım. Biraz karmaşık gelmiş olabilir, ama sakin kafa ile baktığınızda ne kadar kolay olduğunu göreceksiniz eminim :)

Ben ancak bu kadarını verebilirim, gerisi tabi ki size kalmış.

İyi çalışmalar,
Murat Karakoyun...
  • Etiketler;
Yorum Yaz

Yorum yazabilmek için üye girişi yapmanız gerekiyor!

Yukarı Git