Bu yazımızda C# WPF Form kullanarak Sql Server veritabanı bağlantısı kuracağız. Bu bağlantı örneğinde Temel Veritabanı İşlemleri (Select,Insert,Update,Delete) haricinde ayrıca Class kullanımı, DataBinding kullanımı, DataContext kullanımı,ObservableCollection kullanımı, Veri Filtreleme gibi konular hakkında da bilgi bulabilirsiniz. Projeyi kısaca açıklamak gerekirse;
Projemizde ticaret isimli Sql veritabanında bulunan musteri isimli tabloya bağlantı kuracağız. Form açıldığında musterilere ait ad ve soyad bilgisi sol tarafa yerleştirmiş olduğumuz listbox kontrolünde gelecek. Bu işlemi ItemTemplate ve DataTemplate kullanarak gerçekleştireceğiz.
Daha sonra listbox’ta tıklanan müşteriye göre detay bilgilerinin sağ tarafta bulunan textbox nesneleri ve Datetimepicker nesnesinde görüntülenmesini DataContext kullanarak gerçekleştireceğiz.
Buttonlarımız Ekleme, Silme ve Güncelleme işlemlerini gerçekleştirecek.Bu işlemlerde Sorgularımızı Parametre kullanarak oluşturacağız. Ayrıca Veri Çekme işlemi için Veritabanımıza uygun bir şekilde tasarladığımız Class yapısını kullanacağız.
Listbox kontrolünün üstünde yer alan textbox kontrolünü ise Veri filtrelemede kullanacağız. Veri filtreleme işlemini farklı bir yöntemle gerçekleştireceğiz. ObservableCollection koleksiyonunu List koleksiyonuna Linq komutlarını kullanarak filtreleyeceğiz ve listbox kontrolüne ItemSource özelliğini kullanarak bağlayacağız.
Projemize ait ticaret veritabanındaki musteri tablomuz:
Yeni bir WPF Form Application projesi oluşturarak projemize başlayalım.
İlk olarak Solution Explorer penceresinde Projemizin üstüne sağ tıklayarak Model isminde yeni bir klasör oluşturuyoruz. Daha sonra bu klasör üstünde yine sağ tıklayarak Add-Class diyoruz. Örneğimizde Class’ ımızın ismi Musteri.cs olarak verildi.
Musteri isimli Sınıfımızı veritabanımızdaki alanlara uygun bir şekilde aşağıdaki gibi oluşturalım.
Musteri.cs:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | public class Musteri { public Musteri()//Kurucu Metot oluşturduk. { Tarih = DateTime.Now; //Yeni musteri oluşturulduğunda } //Tarihin bugünün tarihi olarak gelmesini sağlıyoruz. int _no; public int No { get { return _no; } set { _no = value; } } string _ad; public string Ad { get { return _ad; } set { _ad = value; } } string _soyad; public string Soyad { get { return _soyad; } set { _soyad = value; } } DateTime _tarih; public DateTime Tarih { get { return _tarih; } set { _tarih = value; } } string _telefon; public string Telefon { get { return _telefon; } set { if (value !="") _telefon = value; else _telefon = "Telefon Numarası Yok"; } } |
Daha sonra form tasarımına geçiyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | <Window x:Class="WpfClassVeri.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="www.yazilimkodlama.com" Height="500" Width="700" Loaded="Window_Loaded"> <Grid Name="grd1"> <Grid.Background> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="White" Offset="0"/> <GradientStop Color="#FF3A2828" Offset="1"/> </LinearGradientBrush> </Grid.Background> <Grid.ColumnDefinitions> <ColumnDefinition Width="217"/> <ColumnDefinition Width="475*"/> </Grid.ColumnDefinitions> <StackPanel VerticalAlignment="Top" Grid.Column="0"> <TextBox x:Name="txtAra" HorizontalAlignment="Left" Height="23" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="202" TextChanged="TextBox_TextChanged" Margin="5,5,0,0"/> <ListBox x:Name="lstMusteri" SelectionChanged="lstMusteri_SelectionChanged" Height="442" Margin="5,5,10,0" > <ListBox.Background> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="White" Offset="0"/> <GradientStop Color="#FF4E989B" Offset="1"/> </LinearGradientBrush> </ListBox.Background> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding Ad}"/> <TextBlock Text="{Binding Soyad}" Margin="10,0,0,0"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </StackPanel> <TextBlock Grid.Column="1" HorizontalAlignment="Left" Margin="143,73,0,0" TextWrapping="Wrap" Text="No" VerticalAlignment="Top"/> <TextBlock Grid.Column="1" HorizontalAlignment="Left" Margin="141,101,0,0" TextWrapping="Wrap" Text="Adı" VerticalAlignment="Top" RenderTransformOrigin="5.066,-6.5"/> <TextBlock Grid.Column="1" HorizontalAlignment="Left" Margin="123,129,0,0" TextWrapping="Wrap" Text="Soyadı" VerticalAlignment="Top"/> <TextBlock Grid.Column="1" HorizontalAlignment="Left" Margin="88,186,0,0" TextWrapping="Wrap" Text="Doğum Tarihi" VerticalAlignment="Top"/> <TextBlock Grid.Column="1" HorizontalAlignment="Left" Margin="120,157,0,0" TextWrapping="Wrap" Text="Telefon" VerticalAlignment="Top"/> <TextBox Name="txtNo" Grid.Column="1" HorizontalAlignment="Left" Height="23" Margin="181,66,0,0" IsEnabled="False" TextWrapping="Wrap" Text="{Binding No}" VerticalAlignment="Top" Width="186"/> <TextBox Name="txtAd" Grid.Column="1" HorizontalAlignment="Left" Height="23" Margin="181,94,0,0" TextWrapping="Wrap" Text="{Binding Ad}" VerticalAlignment="Top" Width="186"/> <TextBox Name="txtSoyad" Grid.Column="1" HorizontalAlignment="Left" Height="23" Margin="181,122,0,0" TextWrapping="Wrap" Text="{Binding Soyad}" VerticalAlignment="Top" Width="186"/> <TextBox Name="txtTelefon" Grid.Column="1" HorizontalAlignment="Left" Height="23" Margin="181,150,0,0" TextWrapping="Wrap" Text="{Binding Telefon}" VerticalAlignment="Top" Width="186"/> <DatePicker Name="dp1" Grid.Column="1" HorizontalAlignment="Left" Margin="181,178,0,0" VerticalAlignment="Top" Width="186" SelectedDate="{Binding Tarih}"/> <Label Content="www.yazilimkodlama.com" Grid.Column="1" Foreground="Beige" HorizontalContentAlignment="Center" HorizontalAlignment="Left" Margin="10,388,0,0" VerticalAlignment="Top" Background="#FF930B0B" FontWeight="Bold" FontFamily="Source Sans Pro Black" FontSize="20" Width="279"/> <Image Grid.Column="1" HorizontalAlignment="Left" Height="151" Margin="315,308,0,0" VerticalAlignment="Top" Width="150" Source="ahmetcansever.png" Stretch="Fill"/> <Button Content="EKLE" Grid.Column="1" HorizontalAlignment="Left" Margin="263,227,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/> <Button Content="YENİ" Grid.Column="1" HorizontalAlignment="Left" Margin="183,227,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/> <Button Content="SİL" Grid.Column="1" HorizontalAlignment="Left" Margin="183,252,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_2"/> <Button Content="GÜNCELLE" Grid.Column="1" HorizontalAlignment="Left" Margin="263,252,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_3"/> </Grid> </Window> |
XAML kodlarını inceleyelim. Bilindiği gibi kontrolleri Toolbox’tan eklediğimiz zaman XAML kodları otomatik olarak eklenmekte. Fakat bizim burada müdahale etmemiz gereken bir kaç yer var.
Grid’ e bir isim veriyoruz. Örneğimizde Name=”grd1″ şeklinde ayarladık. Burada Grid layout’una isim vermemizin nedeni kod kısmında DataContext işleminde bu ismi kullanmamız gerektiği içindir.
Renklendirme ile ilgili XAML kısımlarını atlayabiliriz. Sizde tasarımıza Properties penceresinden istediğiniz gibi renk verebilirsiniz. XAML kodları otomatik olarak eklenecektir.
Listbox kontrolüne dikkat edelim. Burada ItemTemplate ve DataTemplate kullanımının yapıldığını görmekteyiz. Bu işlemleri yaptıktan sonra bağlantı sonrası listbox’ kontrolünde Ad ve Soyad bilgisinin görüntülenmesi sağlanacaktır.
Sırada TextBox kontrollerimiz var. Burada Text özelliklerini yukarıda gördüğünüz gibi Binding etmeniz gerekiyor. Burada Binding No, Binding Ad vs.. yazımlarının oluşturduğumuz Class alanlarına göre yapıldığını hatırlatalım.
Şimdi C# tarafına geçelim.Öncelikle eklememiz gereken namespace’leri ekliyoruz. Burada en alttaki namespace sizin oluşturduğunuz proje ismine göre değişiklik gösterecektir. Uygun bir şekilde yazılması gerekir.
1 2 3 4 5 6 | using System.Collections.ObjectModel; using System.Data.SqlClient; using WpfClassVeri.Model;// Model isimli oluşturduğumuz klasörün // içindeki Class kullanımı için gerekli (WPFClasVeri projemizin adı) |
Daha sonra kullanacağımız bazı nesneleri public olarak tanımlayalım.
1 2 3 4 5 6 7 | SqlConnection baglanti; SqlDataReader dr; SqlCommand komut; Musteri m; ObservableCollection<Musteri> musteriler; |
Bağlantı cümlemizi Form açıldığına hazır olacak şekilde kurucu metot içine yazıyoruz.
1 2 3 4 5 6 7 | public MainWindow() { InitializeComponent(); baglanti = new SqlConnection("Data Source=.; Initial Catalog=ticaret; Integrated Security=true"); } |
Daha sonra verilerin çekilmesi işlemini Listele isimli bir metot tanımlayarak gerçekleşiriyoruz. Bu metodu incelediğimizde Class yapısını ve ObservableCollection koleksiyonunu kullandığını görüyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | public void Listele() { musteriler= new ObservableCollection<Musteri>(); komut = new SqlCommand(); komut.Connection = baglanti; komut.CommandText = "SELECT *FROM musteri"; baglanti.Open(); dr = komut.ExecuteReader(); while(dr.Read()) { m = new Musteri(); m.No = (int)dr[0]; m.Ad = dr[1].ToString(); m.Soyad = dr[2].ToString(); m.Tarih = (DateTime)dr[3]; m.Telefon = dr[4].ToString(); musteriler.Add(m); } baglanti.Close(); lstMusteri.ItemsSource = musteriler; } |
Oluşturduğumuz metodu Form_Load kısmında çağıralım.
1 2 3 4 5 6 | private void Window_Loaded(object sender, RoutedEventArgs e) { Listele(); } |
Bu işlem sonucunda Form açıldığında Listbox içine Müşteriye ait Ad ve Soyad Bilgisinin gelmesini sağladık.Şimdi de Listbox’ta tıklana kişinin detay bilgilerinin diğer Textbox’ lara gelmesini sağlayalım. Binding işleminin en güzel tarafını görelim. 🙂
1 2 3 4 5 6 7 8 | private void lstMusteri_SelectionChanged(object sender, SelectionChangedEventArgs e) { Musteri secilen = new Musteri(); secilen = (Musteri)lstMusteri.SelectedItem; grd1.DataContext = secilen; } |
Sırada temel veri tabanı işlemleri var. Yani Insert,Update ve Delete. Bu işlemler için Buttonlarımızı kullanıyoruz.
Kaydet :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | private void Button_Click(object sender, RoutedEventArgs e) { komut = new SqlCommand(); komut.Connection = baglanti; komut.CommandText = "INSERT INTO musteri (ad,soyad,dtarih,tel) VALUES (@ad,@soyad,@tarih,@telefon)"; komut.Parameters.AddWithValue("@ad",txtAd.Text); komut.Parameters.AddWithValue("@soyad", txtSoyad.Text); komut.Parameters.AddWithValue("@tarih", dp1.SelectedDate.Value); komut.Parameters.AddWithValue("@telefon",txtTelefon.Text); baglanti.Open(); komut.ExecuteNonQuery(); baglanti.Close(); Listele(); } |
Güncelle:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | private void Button_Click_3(object sender, RoutedEventArgs e) { komut = new SqlCommand(); komut.Connection = baglanti; komut.CommandText = "UPDATE musteri SET ad=@ad,soyad=@soyad,dtarih=@tarih,tel=@telefon WHERE mno=@no"; komut.Parameters.AddWithValue("@ad", txtAd.Text); komut.Parameters.AddWithValue("@soyad", txtSoyad.Text); komut.Parameters.AddWithValue("@telefon", txtTelefon.Text); komut.Parameters.AddWithValue("@tarih", dp1.SelectedDate.Value); komut.Parameters.AddWithValue("@no", txtNo.Text); baglanti.Open(); komut.ExecuteNonQuery(); baglanti.Close(); } |
Sil:
1 2 3 4 5 6 7 8 9 10 11 12 13 | private void Button_Click_2(object sender, RoutedEventArgs e) { komut = new SqlCommand(); komut.Connection = baglanti; komut.CommandText = "DELETE FROM musteri WHERE mno=@no"; komut.Parameters.AddWithValue("@no", txtNo.Text); baglanti.Open(); komut.ExecuteNonQuery(); baglanti.Close(); Listele(); } |
Arama yani filtreleme işlemini listbox üzerinde bulunan textbox içeriği değiştiği zaman yani eşzamanlı olarak gerçekleştireceğiz. Bunun için textChanged olayına kodlarımızı aşağıdaki şekilde yazalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 | private void TextBox_TextChanged(object sender, TextChangedEventArgs e) { try { List<Musteri> filtre = musteriler.Where(x => x.Ad.ToLower().Contains(txtAra.Text.ToLower())).ToList(); lstMusteri.ItemsSource = filtre; } catch { } |
Böylelikle projemizi tamamlamış oluyoruz. Kodlarımızın tamamı aşağıdaki şekilde olacaktır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using WpfClassVeri.Model; namespace WpfClassVeri { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); baglanti = new SqlConnection("Data Source=.; Initial Catalog=ticaret; Integrated Security=true"); } SqlConnection baglanti; SqlDataReader dr; SqlCommand komut; Musteri m; ObservableCollection<Musteri> musteriler; public void Listele() { musteriler= new ObservableCollection<Musteri>(); komut = new SqlCommand(); komut.Connection = baglanti; komut.CommandText = "SELECT *FROM musteri"; baglanti.Open(); dr = komut.ExecuteReader(); while(dr.Read()) { m = new Musteri(); m.No = (int)dr[0]; m.Ad = dr[1].ToString(); m.Soyad = dr[2].ToString(); m.Tarih = (DateTime)dr[3]; m.Telefon = dr[4].ToString(); musteriler.Add(m); } baglanti.Close(); lstMusteri.ItemsSource = musteriler; } private void Window_Loaded(object sender, RoutedEventArgs e) { Listele(); } private void lstMusteri_SelectionChanged(object sender, SelectionChangedEventArgs e) { Musteri secilen = new Musteri(); secilen = (Musteri)lstMusteri.SelectedItem; grd1.DataContext = secilen; } private void Button_Click(object sender, RoutedEventArgs e) { komut = new SqlCommand(); komut.Connection = baglanti; komut.CommandText = "INSERT INTO musteri (ad,soyad,dtarih,tel) VALUES (@ad,@soyad,@tarih,@telefon)"; komut.Parameters.AddWithValue("@ad",txtAd.Text); komut.Parameters.AddWithValue("@soyad", txtSoyad.Text); komut.Parameters.AddWithValue("@tarih", dp1.SelectedDate.Value); komut.Parameters.AddWithValue("@telefon",txtTelefon.Text); baglanti.Open(); komut.ExecuteNonQuery(); baglanti.Close(); Listele(); } private void Button_Click_1(object sender, RoutedEventArgs e) { Musteri m = new Musteri(); grd1.DataContext = m; } private void Button_Click_2(object sender, RoutedEventArgs e) { komut = new SqlCommand(); komut.Connection = baglanti; komut.CommandText = "DELETE FROM musteri WHERE mno=@no"; komut.Parameters.AddWithValue("@no", txtNo.Text); baglanti.Open(); komut.ExecuteNonQuery(); baglanti.Close(); Listele(); } private void Button_Click_3(object sender, RoutedEventArgs e) { komut = new SqlCommand(); komut.Connection = baglanti; komut.CommandText = "UPDATE musteri SET ad=@ad,soyad=@soyad,dtarih=@tarih,tel=@telefon WHERE mno=@no"; komut.Parameters.AddWithValue("@ad", txtAd.Text); komut.Parameters.AddWithValue("@soyad", txtSoyad.Text); komut.Parameters.AddWithValue("@telefon", txtTelefon.Text); komut.Parameters.AddWithValue("@tarih", dp1.SelectedDate.Value); komut.Parameters.AddWithValue("@no", txtNo.Text); baglanti.Open(); komut.ExecuteNonQuery(); baglanti.Close(); } private void TextBox_TextChanged(object sender, TextChangedEventArgs e) { try { List<Musteri> filtre = musteriler.Where(x => x.Ad.ToLower().Contains(txtAra.Text.ToLower())).ToList(); lstMusteri.ItemsSource = filtre; } catch { } } } } |
Örneğe ait dosyaları ve veritabanını buradan indirebilirsiniz.
Hocam saygılar, resmi yazışma takibi programı yapıyorum. WPF ve SQL kullanarak. Sol tarafta menüm var ve altı adet butonum var. Ortada content bölümünde user kontrollerle butonların üzerine geldikçe değiştiriyorum. Mesela gelen yazı butonuna tıkladığınızda pencerenin ortasında gelen yazının user kontrolü geliyor ve veritabanındaki gelen yazılar listelenmiiş şekilde önümüze çıkıyor. Buraya kadar yapabildim ama silme ve güncelleme butonlarını yapamadım. Ekleme butonunda ise veri tabanıyla c# arasında çözemediğim bir tarih uyumsuzluğu var. Hocam yardım ederseniz çok mutlu olurum. Son iki günüm kaldı, bankada staj yapıyorum ve işe başlamam bu projeye bağlı…
ne oldu son durum ne 🙂
hocam merhabalar bu projenın yapılmış halını (butun gereklı dosyalarıyla bırlıkte email adresıme gönderirmisiniz umarım çok şey istemiş olmam bu kodları oşekilde inceleyip bu projedekı kullanımlardan yola cıkarak başka proje hazırlıycam çok tşk ederım mail adresıme gonderebılırsenız cok makbule gecer )ycl17041990@gmail.com
Örneğe ait dosyaları ve veritabanı dosyasını yazının altına ekledim. Kolay gelsin.
Merhaba.
aynı örnek için forma bir datagrid ekleyin.
https://yadi.sk/i/AGtj116KwMtNB
listele metodunda listbox yerine datagrid’e itemssource ayarlayın.
dg1.ItemsSource = musteriler;
arama textbox’ında da yine aynı şekilde
dg1.ItemsSource = filtre;
şeklinde yaparsanız çalışacaktır.
hocam dediniz gibi yaptım oldu teşekkur ederim.
birde arama tek seferde birden fazla sutunda arama yapabilirmiyiz. adı ile değilde aynı anda adı,soyadı, telefonunu arayabilirmiyiz.
Yapılabilir. filtreleme yapılan satırı aşağıdaki gibi değiştirirseniz. hem ad hem soyad alanında arama yapılacaktır.
List filtre = musteriler.Where(x => x.Ad.ToLower().Contains(txtAra.Text.ToLower()) || x.Soyad.ToLower().Contains(txtAra.Text.ToLower())).ToList();
çok teşekkür ederim hocam.
hocam hayırlı günler.
müşteri fltresini listbox ile değilde datagrid ile arama yapılan bir örnek yapabilirmisiniz.