23 Şubat 2014 Pazar

WPF DataGrid 2


Bu WPF ile altıncı uygulamamız. Bir önceki uygulamamızda DataGrid ile MS Access bağlantısını kurup pratik kodlarla( sql sorgu cümleleri kullanmadan) verilerimizi DataGrid e aktarmııştık. Bu yazımızda ise sql sorgu cümleleri kullanarak birden fazla tabloda nasıl sorgu yapıyoruz  ve tarih sorgularını ne şekilde gerçekleştiriyoruz bunlara göz atacağız.

Öncelikle veritabanım aşağıdaki gibi Kimlik ve no sütunları ile birbirlerine bağlantılı durumda. Yeni bir proje oluşturarak projeme MS Access veritabanımı ekliyorum.



                Projemi oluşturduktan sonra pencereme DataGrid i sürükleyip bırakıyorum ve istediğim ölçülerde boyutunu ayarlıyorum.  Daha sonra Xaml kısmına DataGrid etiketi içerisine aşağıdaki gibi ItemSource kodunu ekliyorum. Eğer bunu eklemezsek kod kısmı hatasız olsa da verilerimiz DataGrid e aktarılmayaaktır. Ayrıca DataGrid e isim vermeyi de unutmayalım.

<DataGrid ItemsSource="{Binding}"  ... />

                Şimdi  C# kısmına geçerek kodlarımızı eklemeye başlayalım. Öncelikle gerekli olan kütüphanelerimizi ekleyelim.

using System.Data;
using System.Data.OleDb;

public partial class MainWindow : Window
{
    DataSet set;
    OleDbDataAdapter adapter;
    OleDbConnection con;
    public MainWindow()
    {
        InitializeComponent();
    }
}

                Yukarıdaki gibi set ( verileri tutar ) , adapter (sorgu cümlesi ile bağlantıyı tanımlar) ,con ( bağlantıyı kurar ) tanımladık. Şimdi de MS Access in yolunu tanımlayalım ve bağlantıyı kuralım.

public MainWindow()
{
    InitializeComponent();

    string yol = Properties.Settings.Default.KitaplıkConnectionString;
    try
    {
        con = new OleDbConnection(yol);
    }
    catch
    {
        MessageBox.Show("Bağlantı Hatası!");
    }
    getKitap();
 }

                Burada olduğu gibi yolu kolay bir şekilde ayarlayabiliyoruz.  Daha sonra ise try-catch ile bağlantının hata verip vermediğini kontrol ediyoruz. Bundan sonra verilerimizi DataGrid e aktarmak için getKitap()  adında bir fonksiyon tanımlıyorum ve aşağıdaki gibi kodlarımı yazıyorum.

private void getKitap()
{
    string sorgu = "select * from Kitaplar inner join Tarihler on Kitaplar.Kimlik=Tarihler.no";
    string sorgu2 = "select * from Kitaplar,Tarihler where Kitaplar.Kimlik=Tarihler.no";
    adapter = new OleDbDataAdapter(sorgu, con);
    set = new DataSet();
    con.Open();
    adapter.Fill(set, "Kitaplar");
    con.Close();
    datagrd.DataContext = set.Tables[0];
}

                Yukarıdaki kodda iki tane sorgu cümlesi var ve ikisi de tablolarımın tek tablo olarak getirilmesini sağlıyor. İki sorgu cümlesi de aynı işi yapar. Bu kodlar sonucunda aşağıdaki gibi verilerim DataGrid aktarılmış olacaktır. Eğer birden fazla tabloda sorgu yapacaksak inner join,joining konularına göz atmamızda fayda vardır.



                Şimdi de tarih sorgusu yapalım. Bunun için Xaml kısmına bir DatePicker  ve hemen altına bir tane daha DataGrid ekliyorum. Amacım seçili tarihteki kayıtlı bulunan kitapların listelenmesi.
                Bu işlem için DatePicker ı ekledikten ve isim verdikten sonra seçili iken properties kısmından Event sekmesinden SelectedDateChanged kısmana çift tıklayarak fonksiyon oluşturuyorum ve aşağıdaki gibi kodlarımı ekliyorum.

private void DatePicker_SelectedDateChanged_1(object sender, SelectionChangedEventArgs e)
{
    DateTime time = date.SelectedDate.Value.Date;
    string sorgu3 = "select * from Kitaplar inner join Tarihler on  Kitaplar.Kimlik=Tarihler.no where Tarihler.tarih=#" + time.Day + "/" + time.Month + "/" + time.Year + "#";
    set = new DataSet();
    adapter = new OleDbDataAdapter(sorgu3, con);
    con.Open();
    adapter.Fill(set, "Kitaplar");
    con.Close();
    grd2.DataContext = set.Tables[0];
}

                Tarih sorgularında sorgu cümlelerinde sorguların başına “#” koymayı unutmayalım yoksa program hata verir veya istediğimiz şekilde sonuç üretmez.




                Sütunları nasıl istediğimiz gibi düzenleyebileceğimizi ve seçili satırdaki sütun bilgilerine nasıl ulaşacağımıza bir önceki yazımıza aşağıdaki linke tıklayarak ulaşabilirsiniz. Ayrıca uygulamayı diskten paylaşıyorum isteyenler indirip göz atabilirler. Bir sonraki yazımızda ise ekleme , silme ve güncelleme işlemlerine değineceğiz. 


WPF DataGrid


database2

14 Şubat 2014 Cuma

WPF DataGrid


C# WPF DataGrid 

                Bu wpf ile beşinci uygulamamız. Bu uygulamamızda DataGrid e nasıl veri tabanımızdaki verilerimizi aktarıyoruz buna bakacağız. WPF ile DataGrid e veri aktarma işini iki şekilde yapabiliriz. Bunlardan ilki sql cümleleri neredeyse hiç kullanmadan kullanmadan WPF nin bize sağladığı kodlarla bu işi yapabiliriz(oldukça kolay ve kullanışlı) veya sql cümleleri kullanarak da bu işi yapabiliriz. Biz bu yazımızda iki kullanımında nasıl olduğunu basit bir örnek ile kavramaya çalışacağız.
                Bu uygulama için aşağıdaki gibi bir MS Access ile oluşturdum. Bu veri tabanında Kitap Adı , Yazar , Kitabevi , Sayfa ve Fiyat bilgilerini tutuyorum.


                Şimdi birinci uygulamamıza başlayabiliriz. Bunun için yeni bir WPF projesi oluşturuyoruz.

İlk Uygulama 

                Oluşturduğum veri tabanını Solution Explorer daki projemin üzerine sağ tık ile Add--> Existing Item seçeneği ile veri tabanımı projeme ekliyorum.




                Veri tabanım eklediğine göre Pencereme DataGrid i sürükleyip bırakıyorum ve istediğim boyutlarda ayarlıyorum ve “grd” ismini veriyorum.(C# kısmında gözükmesi için gerekli) Bunun haricinde verilerimizin DataGrid de gözükebilmesi için ItemSource=”{Binding}”  şeklinde ayarlamamızı yapmalıyız. Şimdilik Xaml kodumuz aşağıdaki gibi oldu.

<Window x:Class="database1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid x:Name="grd" ItemsSource="{Binding}" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Height="299" Width="497"/>

    </Grid>
</Window>

                Şimdi C# kısmına geçip kodlarımı aşağıdaki gibi ekliyorum.

namespace database1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        /* 1.Aşama Kitaplık isimli veritabanımda Kitaplar isimli tablom için bir adapter tanımlıyorum.
                   Kitaplık veritabanım için bir Dataset tanımlıyorum.*/
        private KitaplıkDataSetTableAdapters.KitaplarTableAdapter adapter = new KitaplıkDataSetTableAdapters.KitaplarTableAdapter();
        private KitaplıkDataSet set = new KitaplıkDataSet();
       
        public MainWindow()
        {
            InitializeComponent();
            /*2.Aşama DataContex e getKitaplar adıyla tanımladığım fonksiyondan dönen bilgileri aktarıyorum.
            Böylece DataGrid gelen verilerle dolduruluyor.*/
            adapter.Fill(set.Kitaplar);
            grd.DataContext = getKitaplar();
        }

        private DataView getKitaplar()
        {
            return set.Kitaplar.DefaultView;
        }
    }
}

                Bu haliyle hazır. Derleyip çalıştırdığımızda verilerimizin aktarıldığını görebiliriz. Eğer göremiyorsak ItemSource=”{Binding}”   kısmını yazdığımızdan emin olalım. Birde getKitaplar( ) şeklinde tanımladığımız fonksiyonun dönüş tipinin DataView olduğundan emin olalım.


                Çalıştırdık ve verilerimiz gözüküyor. Şimdi ki işlemde ise sütunlara bizim istediğimiz ismi verelim. Ancak üstteki gibi bizim veri tabanında verdiğimiz isimler aradaki “_” silinerek yazılmış. Tam isimleri görebilmek için Solution Explorer’da ki …..DataSet.xsd  ye çift tıklayarak tablomuzdaki sütun adlarının tam olarak nasıl olduğunu görebiliriz.


                Aşağıdaki gibi Binding ile Sütun isimlerimi ekliyorum.

<Grid>
    <DataGrid x:Name="grd" ItemsSource="{Binding}" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Height="299" Width="497">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Path=Kimlik}" Header="No"/>
            <DataGridTextColumn Binding="{Binding Path=kitap_ad}" Header="Kitap Adı"/>
            <DataGridTextColumn Binding="{Binding Path=yazar}" Header="Yazar"/>
            <DataGridTextColumn Binding="{Binding Path=yayin_evi}" Header="Yayınevi"/>
            <DataGridTextColumn Binding="{Binding Path=sayfa}" Header="Sayfa Sayısı"/>
            <DataGridTextColumn Binding="{Binding Path=fiyat}" Header="Fiyat"/>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

                Path ile veri tabanındaki sütun ismini , Header ile DataGrid sütununda gözükmesini istediğimiz ismi yazdık. Bu kodları yazarken hemen üstünde de siz ekledikçe eklediğiniz sütun ismi gözükecektir. Eğer gözükmüyorsa bir yerlerde hata var demektir. Çalıştırdığımızda aşağıdaki gibi bir görüntü elde ediyorum.


                Burada hem yeni eklediğim sütunlar hem de sonradan eklediğim sütunlar gözüküyor. Bunu engellemek için eklediğimiz sütuna kadar DataGrid in uzunluğunu ayarlıyoruz ve üstteki resmin alt kısmında gözüken yatay kaydırma çubuğunu iptal ediyoruz. Bunun için DataGrid seçili iken Properties kısmından HorizontalScrollBarVisibility özelliğini “Hidden” olarak değiştiriyoruz. Sonuçta aşağıdaki gibi kendi verdiğim sütun isimlerinin gözükmesini sağlıyorum.


                Buraya kadar sorun yoksa devam edelim. Şimdi de güncelleme işlemlerini nasıl kolay bir şekilde yapacağımıza bakalım. Bunun için aşağıdaki gibi Kodlarımı yazıyorum ve artı eşittir den sonra program benden otomatik olarak Tab+Insert e basmamı istiyor. Basınca fonksiyonu kendisi otomatik oluşturuyor.

public MainWindow()
        {
            InitializeComponent();
            adapter.Fill(set.Kitaplar);
            grd.DataContext = getKitaplar();
            set.Kitaplar.RowChanged += Kitaplar_RowChanged;
        }

        void Kitaplar_RowChanged(object sender, DataRowChangeEventArgs e)
        {
            adapter.Update(set.Kitaplar);
        }

                Gözüktüğü gibi yeşil olan kısımları ekleyerek program çalışırken seçili hücreyi değiştirip Enter a bastığınızda güncelleme işlemini gerçekleştirilecektir. Ancak bu güncelleştirmenin doğruluğunu test edebilmek için projeyi derleyip çalıştırdığımızda projenin bulunduğu klasördeki bin --> Debug  -->Veri Tabanını çalıştırarak güncelleme yapıp yapmadığını test edebiliriz. Arada bir MS Access içinde F5 ile yenilemeyi unutmayalım. Yoksa yine güncellemeler gözükmeyebilir.

                Birinci uygulamamız için son olarak da seçili satırdaki istediğimiz herhangi bir sütununun içerisindeki veriyi nasıl dönderebiliyoruz buna bakalım ve ikinci uygulamamıza geçelim.  Seçili satırdaki sütun verilerini döndermek Form Application daki gibi olmadığından bunu öğrenmem oldukça zor oldu. Ancak sonuçta öğrenmiş bulunuyorum. Şimdi aşağıda seçili satırdaki yazar sütunundaki veriyi MessageBox ile ekrana yazdıralım. Kodlarım aşağıdaki gibi ;

private void grd_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {

            // Aşağıdaki kodlar ile seçili satırdaki istediğim bir sütun verisine erişebiliyorum.SelectedItems[0] olmalı
            DataRowView row = (DataRowView)grd.SelectedItems[0];
            string sec = row["yazar"].ToString();
            MessageBox.Show(sec);
        }



                Seçili satırdaki sütun bilgisini de dönderdiğimize göre ilk uygulamamızı burada sonlandıralım. İkinci uygulamamıza diğer yazımızda devam edeceğiz. Diğer yazımızda sql cümleleri kullanarak bu işlemler nasıl yapılıyor buna göz atacağız. İkinci uygulama için aşağıdaki linke tıklayarak gidebilirsiniz.
                Bu uygulamanın projesini diskten paylaşıyorum isteyenler göz atabilirler.