KMRT BSRN

"Hiç kimsenin ilgisine ihtiyaç duymadığın gün olgunlaşırsın. Hiç kimseden beklentiye girmediğin gün yara almazsın. Ve hiç kimseye bağımlı kalmazsan kazanırsın." OSHO

WIN – DataSet Operations – Creating Search Form With Dataset

3 Yorum


Visual Studio ile Rapid Development hayatımız çok değişmiştir. Visual diller ile bize hız,  esneklik ve pratikliği bir arada sunar. Bu makalemiz ile bu konu üzerine bir başlangıç yaparak hızlı ve pratik bir şekilde uygulama geliştirme konusunda bir makale dizisi oluşturacağım. Tabii ki makalelerimizin baş rol oyuncusu “DataSet” nesnesi olacaktır. Sözü fazla uzatmadan yapacağımız projelerin ne olduğuna kısaca değinmek istiyorum. Bu makale dizisi boyunca “Northwind” veritabanından yararlanarak bazı ekranlar oluşturacağız.. Bu sayede “DataSet” ile yapabileceğiniz işlemleri ve kolaylıklarına değinmiş olacağız..

  • Arama formu.. (Search Form)
  • Birden çok’a filitreleme formu.. (One To Many Filter)
  • Hızlı gözat listesi içeren form.. (Lookup List)

Creating Search Form With Dataset

Evet ilk makale konumuz olan Arama formu oluşturmayı bir de dataset nesnesinden dinlemeye başlayalım.. 🙂

Örnek bir proje oluşturuyoruz.. Ben projenin ismine “CreatingSearchFormWithDataSet” verdim. Projemize 1 adet “Form” ekliyoruz.. Ardından visual studio “Data” menüsünden “Show Data Sources” bölmesinin açılmasını sağlıyoruz..

image

Bu bölmeden “Add New Data Source…” link’ine tıklıyoruz.. Ya da bu bölmedeki sol üst köşedeki veritabanı simgesine tıklayabilirsiniz..

image

Ardından aşağıdaki adımları takip ederek DataSet nesnemizi oluşturuyoruz..

image

image

image

image

image

image

Dataset nesnemiz visual studio tarafından seçtiğimiz tablo ve kolonlardan oluşacak şekilde oluşturuluyor..

image

CustomerDataSet” nesnemizin “Customers” tablosunu seçerek “Form1” üzerine sürükleyerek bırakıyoruz.. Visual Studio bizim için şunları yapıyor;

image

  • 1 adet “CustomerDataSet” nesnesi ekliyor. Bu Data Sources bölümünde oluşturduğumuz Data set nesnesinin bir örneği(instance) olmaktadır.
  • 1 adet “Binding Source” nesnesi ekliyor. Bu nesnenin “DataSource” özelliğini “CustomerDataSet” ; “Data Member” özelliğini “Customers” tablosunu işaret edecek şekilde ayarlıyor.
  • 1 adet “Binding Navigator” nesnesi ekliyor. formun üst kısmıdaki navigation ‘ı içeriyor. Bu navigator nesnesinin Data Source özelliğine oluşturulan Binding Source bağlanmıştır.
  • 1 adet “customersTableAdapter” nesnesi ekleniyor. Bu nesne “Sql Adapter” nesnesinin, oluşturduğumuz CustomerDataSet’i içindeki “Customers“ tablosu için özelleştirilmiş halidir.
  • 1 adet “tableAdapterManager” nesnesi ekleniyor. Bu nesne formunuz üzerinde kullandığınız “CustomerDataSet” ile ilişkili tüm adapter nesnelerini içinde barındırarak tüm adapter nesnelerini merkezi bir yerden yönetmemizi sağlar. Örneğin; “customersTableAdapter” bu nesne tarafından otomatik olarak tanımlanmıştır ve yönetilir. Eğer dataset nesnemize başka bir tablo daha eklersek, o tabloya ait otomatik olarak oluşturulacak olan “[Tabloİsmi]TableAdapter” nesnesi gene otomatik olarak bu “tableAdapterManager” nesnesine bağlanacaktır.

image

Bu işlemlerin ardından form üzerinde oluşturulan DataGridView kontrolünü seçiyoruz ve “Properties” bölümünden “Anchor” özelliğini resimdeki gibi ayarlıyoruz. Böylece form boyutu ile oynandığında DataGridView ‘da boyutlanacaktır.

Kod tarafına baktığımızda bizim için bazı otomatik kodlamaların yapıldığını görüyoruz.

 

Code Snippet
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CreatingSearchFormWithDataSet
{
    public partial class Form1 : Form
    {
        public Form1() {
            InitializeComponent();
        }

        private void customersBindingNavigatorSaveItem_Click(object sender, EventArgs e) {
            this.Validate();
            this.customersBindingSource.EndEdit();
            this.tableAdapterManager.UpdateAll(this.customerDataSet);

        }

        private void Form1_Load(object sender, EventArgs e) {
            // TODO: This line of code loads data into the 'customerDataSet.Customers' table.
            // You can move, or remove it, as needed.
            this.customersTableAdapter.Fill(this.customerDataSet.Customers);

        }
    }
}

Bu kodlar ile form ilk yüklendiğinde “customerTableAdapter” nesnesi ile “CustomersDataSet” içindeki “Customers” tablomuz dolduruluyor. Bir de form’ üzerindeki “Navigator” üzerindeki “Kaydet(Save)” butonuna basıldığında “CustomersDataSet” üzerinde yapılan tüm işlemler kaydediliyor.

Dikkat !!

Sadece “Customers” tablosu değil, tüm tablolardaki değişiklik yapılmış satırlar veritabanına gönderilerek işlemler yapılıyor. Bizim projemizde sadece “Customers” tablomuzu seçtiğimiz için zaten 1 adet tablo bulunmaktadır. Fakat diğer tablolarıda dataset nesnemize eklediysek ve bu tablolarda da “Ekleme(Insert)”, “Güncelleme(Update)”, “Silme(Delete)” işlemleri yaptıysak, bu değişiklikleri yaptığımız satırlar(tüm tablolar değil) adapter nesnesi üzerinden güncelleniyor. İşte burada “AdapterManager” her tablo için özel oluşturulan adapter nesnelerini kullanarak bu işlemleri tek bir noktadan yapıyor.

Uygulamamızı bir çalıştıralım ve neler yapıldığına bakalım.

image

Evet gördüğünüz gibi verilerimiz yüklendir. Navigator üzerinde gördüğünüz işlemler çalışmaktadır. Yani bir kolondaki veriyi değiştirip “Kaydet(Save)” butonuna basarsanız. Veritabanına güncelleme yapılacaktır. Ya da bir satırı seçip sildiğinizde ve tekrar “Kaydet(Save)” butonuna bastığınızda ilgili satır veritabanından silinecektir. Ya da “+” butonuna basarak yeni bir satır oluşacaktır ve bu satır içine “boş bırakılamayacak” verileri girerek tekrar “Kaydet(Save)” butonuna basarsanız veritabanına yeni kayıt eklenecektir. Burada dikkat ettiyseniz yeni kayıt ekleme, güncelleme, silme işlemlerini yaptıktan sonra “Kaydet(Save)” butonuna bastığımızda işlemler veritabanında gerçekleştirilmektedir. Yani kaydetme işlemi yapmadıkça, yaptığınız işlemleri iptal etme şansınız var demektir. 🙂

Dikkat !!

Bazı tablolarda kayıt silme işlemi yaparken hata ile karşılaşabilirsiniz. Bunun sebebi büyük olasılıkla; silmek istediğiniz tablodaki kaydın ilişkili olduğu bir tabloda kullanılmasından kaynaklanır. Önce alt tablodaki kayıtların silme işlemini yapıp bu kaydı silerseniz sorunsuz olarak kaydın silinmesini sağlamış olursunuz.. İlerleyen yazılarımızda bununla ilgili örnekte yapacağız..

Şimdi oluşturacağım basit bir senaryo üzerinden ilerleyelim. Buraya kadar herşey güzel verilerimiz veritabanından listeliyoruz. Yeni kayıt ekleme, silme, güncelleme işlemlerini yapabiliyoruz. Peki belli bir kolona göre arama yapmak istersek bunu nasıl yapacağız. 1 textbox ve 1 buton koyup pataküte kod yazacağız.. Tabii ki hayır.. 🙂 Dataset nesnesi tasarlanırlen çoğu programda olan ortak işlemler düşünülmüş ve bunlara uygun bir nesne oluşturulmuştur. Şimdi senaryomuza uygun olarak programımızda “City” ve “Contact Title” kolonları üzerinde arama yapılmasını sağlayalım.

image

Uygulamamızı kapatıyoruz ve tasarım ekranında “DataGridView” kontrolümüzü seçiyoruz. Sağ üst köşesindeki “Küçük okçuk” ‘a tıklayarak “Add Query” linkine tıklıyoruz..

image

Ekranın üstünde şu açıklama yazıyor.. Varolan ya da yeni bir sorgu girin. Bir ToolStrip kontrolü eklenecek ve bu kontrol ile sorgunuz çalıştırılacaktır. Varolan bir sorguyu değiştirmek ya da stored procedure kullanmak istiyorsan, dataset designer ‘daki ilgili tabloya ait “adapter” üzerindeki “Command” ayarını kullanın.

Biz o değişikliği daha sonra yapacağız.. 🙂 Yukarıdaki resimde gördüğünüz gibi “FillByCity” olarak yeni bir sorgu oluşturacağımı belirttim diyerek “Query Builder…” butonuna basıyorum..

image

İlk önce “City” alanının “Filter” bölümüne “ LIKE @City + ‘%’ ” ifadesini yazıyoruz. Böylece “ @City ” değişkeni ile göndereceğimiz değer ile başlayan şehirlerin listelenmesini sağlayacaktır. Listeleme sonucunda elde edilen veriler “City” kolonuna göre A’dan Z’ye sıralanması için “Sort Type” alanı “Ascending” olarak seçtim.

image

Execute Query” bastığımızda bizden “ @City ” değişkenin değerini isteyecektir. “Lon” yazarak “OK” bastığınızda “London” değerine sahip satırlar gelecektir. Sorgumuz hazır “OK” basarak “Query Builder…” ekranını sonlandırıyoruz..

image

Bu ekranda yazdığımız sorgumuz görünmektedir. Bu ekranıda “OK” diyerek sonlandırıyoruz. Form’umuza otomatik olarak City kolonu üzerinden arama yapan ToolStrip kontrollerimi eklenecektir.

image

image

Biraz görsellik yaparak makalemizi sonladıralım. Yeni eklenen “ToolStrip” kontrolünü ve onun içindeki kontrolleri görmüşsünüzdür. “City :” yazan label’ı “Bold”, “FillByCity” yazan butonoda yeni bir “Image” ekliyorum. “DisplayStyle” özelliğini “Image” olarak ayarlamayı unutmayın !

image

Uygulamamızı çalıştırıyoruz..

image

Gördüğünüz  gibi aranılan kelime ile başlayan tüm kayıtlar listelendi. Çok hızlı bir şekilde “ContactName” ve “ContactTitle” kolonları içinde arama özelliği kazandıralım.

image

image

image

image

City Alanına Göre Arama

image

Contact Title Alanına Göre Arama

image

ContactName Alanına Göre Arama

image

Eğer arama alanlarını tek bir menü satırında toplamak isterseniz; Navigator’ı seçiyoruz ve “Smart Tag(Sağ üstteki küçük okçuk)” ‘dan “Embed in ToolStripContainer” seçin.

image

DataGridView’ı Oluşan panel’in içine atın ve DataGridView’ın “Dock” özelliğini “Fill” olarak ayarlayın..

image

Sırası ile yukarıda kalan arama ToolStrip kontrollerini kes yaparak Navigator ‘ın bulunduğu panel’i genişletin ve yanında boş bir alana yapıştır’ın. Aynı işlemi hepsi için yapın.

image

Tüm arama alanlarını bu alana taşıdıysanız. Bu panel’in “Dock” özelliğini “Fill” yapın. Sonra her bir arama ToolStrip’inin taşınabilir olduğunu göreceksiniz. İstediğini gibi düzenleyebilirsiniz.. Ben hepsini alt satırda yan yana dizdim..

image

Bu kes – yapıştır işleminde kestiğiniz kontrolün olay bağlantıları kopuyor. Bu bağlantıları tekrar yapmanız gerekmektedir. Sadece ilgili kontrolü seçip, ilgili olayına gelerek bağlı olduğu metodu seçin. Aşağıdaki resmin solundaki gibi. City arama butonunu seçtim ve “Click” olayını, ilgili metoduna bağladım.

image

Uygulama çalışıyor süper.. 🙂

image

Herkese iyi çalışmalar..

Yazar: K. Murat BAŞEREN, MBA, MCP

I am a senior software developer, MCP, consultant, blogger, former chemist and software trainer. My interests range from software developer to technology. I am also interested in web development, education, and coffee.

3 thoughts on “WIN – DataSet Operations – Creating Search Form With Dataset

  1. Çok teşekkür ederim ne kadar işime yaradı bilemezsiniz

    Beğen

  2. çok teşekkür ederim, güzel anlatım için. fakat hocam bende bir sorun var. tableadapter’e insert,update komutu ekledim. ve textboxlardan aldığım bilgileri ekliyorum, değiştiriyorum. yalnız bu ekleme ve güncellemeler, program açılıp kapanınca gidiyor. yani sadece dataset üzerinde kalıyor, veri tabanına geçmiyor. yardımcı olursanız sevinirim.

    Beğen

    • Merhaba Ali bey; eğer işlemlerinizi makalede anlatıldığı gibi yaptıysanız otomatik olarak eklenmiş bir kod olacaktır.

      this.Validate();
      this.customersBindingSource.EndEdit();
      this.tableAdapterManager.UpdateAll(this.customerDataSet);

      Bu kod ile kaydetme işlemleri veritabanına işlenir. Eğer bu kodu sildiyseniz ya da eklenmemişse, bir buton ekleyerek bu kodu Click olayına ekleyiniz.
      Bunun dışında eğer database dosyanı proienizin içinde ise; solution explorer’da database dosyasına sağ tıklayarak properties seçin. Özellikler penceresi açılacaktır. BUrada “Copy to Output Directory” ifadesi “Copy Always” seçili olabilir. Bunun anlamı program her kapanıp açıldığında veritabanı dosyanız yeniden kopyalanacaktır. Dolayısı ile sizin işlem yaptığınız veritabanı dosyası silinecek ve kaydettiğiniz veriler gidecek. Proienizdeki hazırlamış olduğunuz veritabanı dosyası yeniden kopayalanacaktır. O sebeple bu seçeneği “if newer” yapmalısınız ki veritabanını sadece 1 defa yoksa bin klasörü içine kopyalasın. Aşağıdaki resimdeki ekran gibi ayarlayınız.

      http://social.msdn.microsoft.com/Forums/getfile/116389

      Beğen

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s