GridViewde ki Kayıtları Okumak ve Metin Dosyasına Aktarmak

GridView’daki Kayıtları Okumak ve Metin Dosyasına Aktarmak ASP.NET 2.0 ile gelen yeni veri kontrollerinden GridView web uygulamalarında kullandığımız en zengin veri kontrolüdür. Bir programcının birçok ihtiyacını karşılayabilecek gelişmiş özelliklere sahip olan bu kontrolle tek satır kod yazmadan dahi veriye bağlanabilmekte, getirilen verileri sayfalayıp sıralayabilmekte, hatta yine kod yazmadan otomatik güncelleme ve silme işlemlerini de gerçekleştirebilmekteyiz. Bu kontrol ile ilgili olarak programcıya düşen görev ise kontrolün varolmayan özelliklerini çalıştırabilecek işlemleri yapmak kalıyor. Bu işlemlerden birisi de GridView"deki verilerin farklı bir ortama aktarılması olacaktır. Farklı ortamdan kastımız farklı bir tabloya, farklı bir nesneye veya bir dosyaya olabilir. Bu makalemizde GridView kontrolünde bulunan verilere programatik yollarla nasıl erişebileceğimize ve bu verileri txt uzantılı olarak bir metin dosyasına nasıl dönüştürebileceğimizi göreceğiz.GridView veriyi tutuş şekli açısından DataTable nesnesinde benzetilebilir. GridView"da saklanan kayıtlar satırlar ve sütunlar halinde tutulmaktadır. Gridview"deki satırlar GridViewRow, sütunlarda DataControlField tipinden birer nesne olarak saklanır. Satırlara Rows kolleksiyonundan(collection), sütunlara ise Colums kolleksiyonunda erişebilmekteyiz. Bir satırda bulunan bir sütunun değerine elde etmek için ise GridViewRow nesnesinin Cells kolleksiyonunu kullanarak ilgili hücredeki bilgilere erişebiliriz. Aslında ASP.NET"te dosya download işlemini biliyorsak, bu bilgiler bile bizim bir gridview içerisindeki kayıtları metinsel bir dosyaya aktarmamız için yeterli olacaktır. Kolleksiyonu ve kolleksiyonda saklanan verinin tipini bildiğimize göre bir foreach döngüsü içerisinde bu değerlere erişebilmemiz mümkündür. Bir sayfaya ekleyeceğimiz GridView"a gvUrunler adını verip, gerekli ayarlamaları yapıp bir SqlDataSource kontrolüne bağlayalım. Yapacağım örnekte AdventureWorks veritabanında yer alan Production.Product tablosunu kullanacağım(Sorgu: SELECT ProductID, Name, Color, ListPrice, ModifiedDate FROM Production.Product). Sayfaya eklenen bir buton kontrolünün Click event"inde grid kontrolünün içerisindeki verilere aşağıdaki örnek kodlar ile erişebiliriz. Kodlara bakılacak olursa; bir foreach döngüsü ile griddeki satırlar içerisinde adım adım ilerlenmiş ve elde edilen satırın Cells kolleksiyonundan 1 numaralı indeksteki değeri istenilmiş(yani Name sütunu). protected void Button1_Click(object sender, EventArgs e) {   Response.Write("GridView"daki ürünlerin isimleri:");    foreach (GridViewRow row in gvUrunler.Rows)       Response.Write(row.Cells[1].Text + "
");}Şekil: Butona tıklandığında o an gridviewde bulunan satırların Name alanları sayfaya yazdırıldıBuradaki okuma işlemi belirli bir hücre üzerinden gerçekleştirildi. Eğer tüm hücreleri okumak istersek sütun sayısını bilmek ve ona göre de foreach döngüsünün içerisine bir for döngüsü açmak gerekecektir. Gridviewdaki sütunlar Columns kolleksiyonunda saklandığı için bu kolleksiyonun Count özelliği bize toplam sütun sayısını getirecektir. Aşağıdaki kodlar ile de griddeki tüm ve satırların tüm hücrelerini okuyabiliriz. protected void Button1_Click(object sender, EventArgs e){   Response.Write("GridView"daki ürünler:");   foreach (GridViewRow gvr in gvUrunler.Rows)   {      for(int i=0; i < gvUrunler.Columns.Count; i++)         Response.Write( gvr.Cells[i].Text + " ");      Response.Write("
");   }}Şekil: Gridviewdaki o an bulunan bütün veriler getirildiGridview"ın Rows kolleksiyonu, sadece sayfa çalıştırıldığı anda görüntülenen kayıtları içerisinde saklayacaktır. Eğer grid kontrolünü sayfalandırılmış şekilde kullanıyorsak ve birden fazla sayfada veriler tutuluyorsa yukarıdaki kodlar çalıştırıldığında sadece o an üretilen sayfada grid içerisine hangi satırlar geliyorsa o satırların bilgilerine erişebiliriz. Eğer amacımız griddeki bilgileri bir dosyaya aktarmak ise olaya farklı yaklaşımlarımız olabilir. Sadece o an gridde görüntülenen satırları dosyaya kaydetmek isteyebileceğimiz gibi, belirli sayıdaki satırı veya gride bağlanan tüm kayıtlarıda dosyaya kaydetmek isteyebiliriz. Dilerseniz gridviewdaki kayıtları metinsel bir dosyaya kaydetme işlemini gerçekleştiren ve bu üç farklı durumu gözönüne alan küçük bir uygulama yazalım. Sayfaya ekleyeceğimiz gridview kontrolünü bir SqlDataSuorce kontrolüne bağlayalım. Sorgu olarak yukarıdaki sorguyu aynen kullanabiliriz. Yine Update,Delete işlemleri içinde gerekli sorguları oluşturalım. Burada her ne kadar Update-Delete işlemi yapmayacak olsakta gride eklenecek Update-Delete butonlarının metinsel dosyamıza eklenmesini de nasıl engelleyebileceğimizi ele alacağız. GridView dışında sayfaya bir RadioButtonList kontrolü ve bir de Button kontrolü ekleyelim. RadioButtonList kontrolü ile sadece bu sayfadaki verileri kaydetme, ilk 50 veriyi kaydetme ve tüm verileri kaydetme seçeneklerini ele alacağız. Sayfamızın tasarımı ve kodları aşağıdaki gibi olacaktır.Şekil: Oluşturduğumuz sayfanın Design kısmı                                                                                        Sadece bu kayıtlar   İlk 50 kayıt   Tüm kayıtlar Sayfanın tasarımını ve gridviewa bağlanacak verinin ayarlanmasından sonra adım adım yapılacak işlemleri kodlamaya başlayalım. Öncelikli olarak gridde bulunan Edit ve Delete butonlarının oluşturulacak txt dosyasında bulunmasını istemeyeceğimiz için bu link butonlarını yazdırma işleminde çıkarmamız gerekecek. Update ve Delete gibi komut çalıştıran butonlar gridview içerisinde CommandField olarak tutulduğu için gridviewdaki CommandField kısmını programatik olarak gridden çıkarmamız yeterli olacaktır. Bu işlemi gerçekleştirmek için GereksizKolonlariSil adında bir metot yazalım. Bu işlemin ardından da kullanıcının radiobuttonlistten işaretleyeceği seçeneğe göre gridden farklı sayıda veri okunacağı için bu kısmı çözümleyelim. Burada;  - Sadece bu kayıtlar seçeneğini seçilirse direkt olarak grid içerisindeki satırları okuma ve download işlemi yaptırmamız gerekecek.   - İlk 50 kayıt seçeneği seçilirse grid kontrolünün PageSize özelliğini 50 yapmak gerekecek. Yine ilk 50 kaydın getirilebilmesi için de PageIndex özelliğinin 0 olarak ayarlanması gerekecek. Ardından grid kontolünün DataBind metodunu çağıracak olursak ilk sayfaya gidilecek ve ilk 50 kayıt yüklenecektir. Böylece ilk 50 kaydın txt formatında download edilmesini sağlayabileceğiz.   - Tüm kayıtlar seçeneği seçilirse gridview kontrolünün AllowPaging özelliğini false yapmamız ardından DataBind metodunu çağırmamız gerekecek. Böylece yapılacak postback işleminin sonucunda gridde sayfalama yapılmayacağı için tüm kayıtlar yüklenecek, dolayısıyla da download işleminde tüm kayıtlar dosyaya yazdırılabilecek. Sayfaya eklediğimiz butonun click eventine aşağıdaki kodlar eklendiğinde grid kontrolündeki verileri istenilen şekilde download işlemine hazırlamış oluruz. Kodların en alt kısmında da az sonra yazacağımız ve metinsel dosyaya kaydetme işlemini üstlenecek olan metodu çağırıyoruz. private void GereksizKolonlariSil(){   // Eğer Select, Edit ve Delete gibi CommandFieldlar aktif ise bu butonların bulunduğu sütunu gridden kaldırıyoruz.   for (int i = 0; i < gvUrunler.Columns.Count; i++)   {      if (gvUrunler.Columns[i] is CommandField)         gvUrunler.Columns.RemoveAt(i);   }}protected void Button1_Click(object sender, EventArgs e){   GereksizKolonlariSil();   // Sadece bu kayıtlar şıkkı seçilirse ek bir işlem yapmaya gerek yoktur. Diğer iki şıkkı ele alıyoruz.   if (rblSecim.SelectedIndex == 1)  // İlk 50 kayıt   {      gvUrunler.PageIndex = 0;      gvUrunler.PageSize = 50;   }   else if (rblSecim.SelectedIndex == 2)  // Tüm kayıtlar   {      gvUrunler.AllowPaging = false;   }   gvUrunler.DataBind();   TextKaydet();  // Bu metot az sonra yazacağımız ve kayıtları metinsel dosyaya aktaracak olan metot} Bu şekilde gridview kontrolünün içeriğini yazdırılacak hale geldik. Butona tıklandığında postback işlemi gerçekleşeceği için gridview kontrolünü yeniden düzenliyoruz; fakat az sonraki yapılacak işlemlerde postback sonrası dosya download edileceği için sayfa yenilenmeyecektir, dolayısıyla da bizim design kısmında yaptığımız ayarlamalar geçerli kalacaktır. Aşağıdaki kodlarda da grid içerisindeki verileri metinsel dosyaya kaydetme işlemini üstlenecek TextKaydet metodu bulunmaktadır. protected void TextKaydet(){   // string birleştirme işleminin daha performanslı olması için System.Text isim alanı    // altında yer alan StringBuilder ile string birleştirme işlemi yapacağız   StringBuilder sb = new StringBuilder();   // Öncelikli olarak gridviewdaki sütunların başlıklarını okuyor ve değişkenimize ekliyoruz   foreach (DataControlField cell in gvUrunler.Columns)   {      sb.Append(cell.HeaderText + " ");  // HeaderText property"si hücrenin başlık bilgisini getirir   }   sb.Append(Environment.NewLine);    // Yeni bir satır açıyoruz   // Artık kayıtları tek tek okuyup değişkenimize ekliyoruz   foreach (GridViewRow gvr in gvUrunler.Rows)   {      for (int i = 0; i < gvUrunler.Columns.Count; i++)      {         // Eğer hücrede boş değer varsa   karakterinin yazılmasını engellemek için kontrol yapıyoruz         if (gvr.Cells[i].Text == " " || gvr.Cells[i].Text == "")            sb.Append(" - ");         else            sb.Append(gvr.Cells[i].Text + " ");      }      sb.Append(Environment.NewLine);  // Satır bittiğinde bir alt satıra geç   }   // Okuma işlemi bitti ve değişken hazır. Artık metinsel dosyanın oluşturulması ve kullanıcı tarafından    // yüklenmesi için gerekli işlemleri gerçekleştiriyoruz   Response.Clear();   Response.AddHeader("content-disposition", "attachment;filename=Urunler.txt");   Response.ContentType = "application/vnd.text";   Response.Write(sb.ToString());   Response.End();} Şekil: Sayfayı çalıştırdığımızda işaretlediğimiz seçeneğe göre txt uzantılı dosyayı bilgisayarımıza indirebilirizBöylece gridview içerisindeki kayıtları okuma işlemini gerçekleştirerek alınan bilgileri txt uzantılı olarak metinsel bir dosya içerisinde sunmuş olduk. Özellikle basit anlamda kullanıcı arayüzlerinde yapılan listeleme ve raporlama işlemlerinde işimizi görebilecek tarzda küçük bir web uygulaması geliştirmiş olduk. Benzer yollarla okunan verileri başka bir kaynağa (farklı bir sunucudaki tabloya veya bir Excel dosyasına gibi) aktarabiliriz. Bir başka makalede görüşmek dileğiyle.

Döküman Arama

Başlık :

Kapat