Composite WPF etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Composite WPF etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Pazar, Ekim 25, 2009

WPF - ContextMenu Kontrolü

Windows Presentation Foundation ile uygulama geliştirirken kullanabileceğimiz kontrol paleti işlerimizi rahatlıkla yürütebileceğimiz kadar geniştir. Araç kutusu içerisinde yer alan kontroller Framework sürümünü arttırdıkça ve codeplex, code.msdn gibi sitelerde yer alan projeler yardımı ile daha da artmaya devam etmektedir. WPF 'in grafiksel ve görsel gücüne günlük yaşantı da kullanılan kontrollerin de kullanılabilir olması sayesinde en basit uygulamalardan en karmaşık uygulamalara kadar geliştirilebilme olanağı tanınıyor.

Bu yazımızda WPF kontrollerinden ContextMenu kontrolünü nasıl kullanabileceğimizi açılmaya çalışıyoruz.

WPF - ContextMenu Control

Context Menu kontrolü yardımı ile kontrollerin üzerinde sağ tıklama yaptığımızda karşımıza çıkacak olan menüyü sağlamaktadır. Peki bu işlemi yaparken neler yapabiliriz. İlk olarak aklımıza kopyala, yapıştır ve kes işlemlerini yapabilmek gelmektedir. Onun dışında seçilen parametreye göre internet penceresinde arama yapmak gibi işlemleri belirtebilmemiz mümkündür. Ayrıca ContextMenu kontrolünü eklemiş olduğumuz herhangi bir kontrole özellik olarak eklenebilinmeside mümkündür. Zaten en sık olarak kullanılan yöntemde bu şekildedir.

Kullanım şekline değinmek gerekirse, kontrollerin alt özellikleri olarak ContextMenu oluşturuluyor. Sonrasında ise, MenuItem ile menü içerisinde gözükecek olan ikonları ve içerikleri belirlememiz yeterli olacaktır. Örnek üzerinde kullanmak gerekirse, yapmamız gereken aşağıdaki gibi olacaktır.

ContextMenu.xaml
<RichTextBox>
    <RichTextBox.ContextMenu>
        <ContextMenu>
            <MenuItem Command="Cut" Header="Kes">
                <MenuItem.Icon>
                   <Image Source="Images/cut.png" />
                </MenuItem.Icon>
            </MenuItem>
            <MenuItem Command="Copy" Header="Kopyala">
                <MenuItem.Icon>
                    <Image Source="Images/copy.png" />
                </MenuItem.Icon>
             </MenuItem>
             <MenuItem Command="Paste" Header="Yapıştır">
                <MenuItem.Icon>
                    <Image Source="Images/paste.png" />
                </MenuItem.Icon>
             </MenuItem>
         </ContextMenu>
     </RichTextBox.ContextMenu>
</RichTextBox>

RichTextBox kontrolüne ContextMenu 'yu ekledik ve sonrasında projeyi çalıştırdığımızda aşağıdaki gibi bir görüntüye sahip olacaktır.


Gayet hoş bir görüntü ile karşı karşıyayız. :) Kullanmış olduğumuz RichTextBox kontrolünün özelliklerini incelersek ContextMenu özelliğini aktifleştiği ve elemanların eklendiği gözlemlenmektedir.


Özellikler ekranında da ContextMenu nun kullanıldığını gördük. Şimdi ise kullanım esnasında karşılaşılabilecek durumlardan birine değinelim. Form üzerinde veri girişi yapabildiğimiz bir kontrol var ve biz de o kontrole özel bir menü konrolü oluşturduk. Ancak bu kontrol form üzerinde eklemiş olduğumuz bir olasılık sebebi ile pasif duruma geçti. Ancak bizim amacımız pasif durumda bile olan kontrollerde de ContextMenu ile belirttiğimiz işlemlerin yapılmasını istiyoruz. Eğer bu tür bir durumla karşılaşıyorsak ContextMenuService.ShowOnDisabled özelliğine değer atayarak karşılaştığımız istisnai durumu ortadan kaldırabiliriz.

ContextMenu.xaml
<RichTextBox IsEnabled="False" ContextMenuService.ShowOnDisabled="True">
    <RichTextBox.ContextMenu>
        <ContextMenu>
            ...
         </ContextMenu>
      </RichTextBox.ContextMenu>
</RichTextBox>

Bir diğer karşılaşabileceğimiz durum ise, bir ContextMenu kontrolünün diğer bir ContextMenu kontrolü içerisinde kullanmak isteyebiliriz. Bu durumda yapılması gereken diğer ContextMenu içeriğini kullanılabilmesi mümkündür. Yapılması gereken ise, CompositeCollection özelliğini kullanmak yeterli olacaktır.

ContextMenu2.xaml
<Window x:Class="WPFControls.ContextMenu2"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    Title="ContextMenu2" Height="300" Width="300">
    <Grid Background="Transparent">
        <Grid.Resources>
             <x:Array Type="{x:Type sys:Object}" x:Key="extensions">
                  <Separator />
                  <MenuItem Header="Ek MenuItem 1" />
                   <MenuItem Header="Ek MenuItem 2" />
                   <MenuItem Header="Ek MenuItem 3" />
             </x:Array>
        </Grid.Resources>
     <Grid.ContextMenu>
         <ContextMenu>
             <ContextMenu.ItemsSource>
                   <CompositeCollection>
                       <MenuItem Header="Standart MenuItem 1" />
                       <MenuItem Header="Standart MenuItem 2" />
                       <MenuItem Header="Standart MenuItem 3" />
                         <CollectionContainer Collection="{StaticResource extensions}" />
                   </CompositeCollection>
                </ContextMenu.ItemsSource>
            </ContextMenu>
        </Grid.ContextMenu>
     </Grid>
</Window>

XAML dosya üzerinde yapmış olduğumuz işlemler sonrasında karşımıza aşağıdaki gibi bir ekran görüntüsü oluşacaktır.



ContextMenu özelliklerini incelemeye devam ediyoruz. Eklemiş olduğumuz menü elemanlarının ToolTip ve GestureText özelliklerine de değer atanabilmesi mümkündür. Bu işlem için yapılması gereken aşağıdaki gibidir.

ContextMenu.xaml
<MenuItem Command="Kopyala" Header="Kopyala" InputGestureText="CTRL + C" ToolTip="Daha sonra kullanmak üzere yazıları kopyalayabilirsiniz." />

ContextMenu kontrolüne eklemiş olduğumuz değerlerin herhangi birine tıklanması sonucunda da işlem yapılabilmesi mümkündür. Click olayını kullanmak yeterlidir.

ContextMenu.xaml
<MenuItem Header="Temizle" Click="MenuItemClear_Click"/>

ContextMenu.xaml.cs
private void MenuItemClear_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("MenuItem 'a tıklandı");
    txtControl.Text = "";
}

ContextMenu kontrolü için değineceğimiz son konu ise kod üzerinden oluşturmak olacaktır. XAML kod dosyasının yani formun boyutunun artmaması için ya da belirli bir işlemden sonra menü kontrollerini kullanmak istediğimiz durumlarda kod içerisinden de Contextmenü kontrolünü kullanabilmemiz mümkündür. Bu işlemi gerçekleştirebilmek için ContextMenu ve MenuItem sınıflarını kullanmak yeterli olacaktır.

ContextMenu.xaml.cs
ContextMenu mainMenu = new ContextMenu();
mainMenu.Background = Brushes.LightGreen;
mainMenu.Height = 300;
mainMenu.Width = 200;

MenuItem item1 = new MenuItem();
item1.Width = 50;
item1.Header = "Yapıştır";
mainMenu.Items.Add(item1);

MenuItem item2 = new MenuItem();
item2.Width = 50;
item2.Header = "Temizle";
item1.Items.Add(item2);

MenuItem item3 = new MenuItem();
item3.Width = 50;
item3.Header = "Kopyala";
item1.Items.Add(item3);

Basit olarak belirtmiş olduğumuz kod ile ContextMenu oluşturma işlemini daha gelişmiş bir şekilde, ikonları da kullanarak tamamen bir menü konrolü olarak kullanabileceğimiz bir metot şekline dönüştürelim.

ContextMenu.xaml.cs
private void OrnekCalisirMenu()
{
    ContextMenu mainMenu = new ContextMenu();
    txtControl.ContextMenu = mainMenu;

    MenuItem item1 = new MenuItem();
    item1.Header = "Paste";
    item1.Foreground = Brushes.Black;
    item1.Background = Brushes.Transparent;
    mainMenu.Items.Add(item1);

    MenuItem item2 = new MenuItem();
    item2.Header = "Clear";
    mainMenu.Items.Add(item2);

    //çalışma anında menü içerisinde kullanılacak olan resim ekleniyor.

    BitmapImage copyimage = new BitmapImage();
    copyimage.BeginInit();
    Uri myUri = new Uri("Images/Copy.png", UriKind.RelativeOrAbsolute);
    copyimage.UriSource = myUri;
    copyimage.EndInit();

    Image iconImage = new Image();
    iconImage.Source = copyimage;

    MenuItem item3 = new MenuItem();
    item3.Header = "Copy";
    item3.Icon = iconImage;
    mainMenu.Items.Add(item3);

}

Sonuç olarak belirli bir koşul altında ya da sayfanın yüklenmesi anında kullanılabilecek olan ContextMenu kontrolünü sağlayacak metodu oluşturduktan sonra istediğimiz heryerde kullanabilme imkanımız vardır.

Sonuç olarak hazırlanan windows tabanlı uygulamalarda en sık kullanılan özelliklerden biri olan ContextMenu kontrolünü detaylı bir şekilde açıklamaya çalıştık. Hem XAML kod üzerinden hemde kod yardımı ile nasıl kullanabileceğimizi inceledik.

Umarım yararlı olabilmiştir.

WPF - PasswordBox Kontrolü

Windows Presentation Foundation ile uygulama geliştirirken kullanabileceğimiz kontrol paleti işlerimizi rahatlıkla yürütebileceğimiz kadar geniştir. Araç kutusu içerisinde yer alan kontroller Framework sürümünü arttırdıkça ve codeplex, code.msdn gibi sitelerde yer alan projeler yardımı ile daha da artmaya devam etmektedir. WPF 'in grafiksel ve görsel gücüne günlük yaşantı da kullanılan kontrollerin de kullanılabilir olması sayesinde en basit uygulamalardan en karmaşık uygulamalara kadar geliştirilebilme olanağı tanınıyor.

Bu yazımızda WPF üzerinde kullanılan en temel kontrollerin özelliklerini inceliyor ve nasıl kullanıldığını, özellikleri nelerdiri inceliyor olacağız.

WPF - PasswordBox Control
PasswordBox kontrolünün TextBox kontrolüne benzer bir tasarımı vardır. Tek farkı içerisine yazmış olduğumuz karakter,rakam ve özel karakterleri şifreli bir şekilde göstermesidir. Bu özelliği dışında en önemli özeliklerinden biri de kesme,kopyalama ve yapıştırma işlemlerine varsayılan olarak izin vermemesidir.



Windows1.xaml
<StackPanel>
    <Label Content="Şifreniz"/>
    <PasswordBox x:Name="PasswordBox" Width="130"/>
</StackPanel>

PasswordBox kontrolü kullanırken karakterleri tombul noktalarla değilde başka bir karakter ile de göstermek isteyebilirsiniz. Bu durumda yapmanız gereken PasswordChar özelliğine bir değer vermek olacaktır.

<StackPanel>
    <Label Content="Şifreniz"/>
    <PasswordBox x:Name="PasswordBox" PasswordChar="*" Width="130"/>
</StackPanel>

Karakteri değiştirdikten sonra aklınıza gelebilecek bir diğer değişiklik düşüncesi ile karakter girişini sınırlamak olabilir. Bu durumda ise MaxLength özelliğine bir değer atamanız yeterli olacaktır.

<StackPanel>
    <Label Content="Şifreniz"/>
    <PasswordBox x:Name="PasswordBox" PasswordChar="*" MaxLength="6" Width="130"/>
</StackPanel>

PasswordBox kontrolüne girilebilecek max karakter sayısınıda belirledik.

WPF Password Kontrolünde Databinding İşlemi
Passworbox kontrolü ile veri işlemlerini veriye bağlama yolu ile direk yapamayız. Bunun sebebi ise DependencyProperty tarafında desteklenen bir şifre türü değildir.

Nedenini açıklamak gerekirse, DataBinding ile tuttuğumuz parolalalar güvenlik sebebiyle iyi bir tercih değildir. Ancak bazı durumlarda bu kontrolünü kullanmak gerekebilmektedir. Özel durumlarda aşağıda oluşturacağımız PasswordBoxHelper 'dan yararlanabilirsiniz.

Windows1.xaml
<StackPanel>
    <PasswordBox w:PasswordHelper.Attach="True"
        w:PasswordHelper.Password="{Binding Text, ElementName=plain, Mode=TwoWay}"
        Width="130"/>
    <TextBlock Padding="10,0" x:Name="plain" />
</StackPanel>

XAML kod tarafında PasswordHelper sınıfını xmlnamespaces (xmlns:w) ekliyoruz. Sonrasında ise PasswordHelper.Attach ve PasswordHelper.Password özelliklerini orjinal password özelliğine bağlayarak güvenlik açıklarını ortadan kaldırmış oluyoruz.

PasswordHelper.cs
public static class PasswordHelper
{
    public static readonly DependencyProperty PasswordProperty =
    DependencyProperty.RegisterAttached("Password",
        typeof(string), typeof(PasswordHelper),
    new FrameworkPropertyMetadata(string.Empty, OnPasswordPropertyChanged));

    public static readonly DependencyProperty AttachProperty =
    DependencyProperty.RegisterAttached("Attach",
    typeof(bool), typeof(PasswordHelper), new PropertyMetadata(false, Attach));

    private static readonly DependencyProperty IsUpdatingProperty =
    DependencyProperty.RegisterAttached("IsUpdating", typeof(bool),
        typeof(PasswordHelper));


    public static void SetAttach(DependencyObject dp, bool value)
    {
        dp.SetValue(AttachProperty, value);
    }

    public static bool GetAttach(DependencyObject dp)
    {
        return (bool)dp.GetValue(AttachProperty);
    }

    public static string GetPassword(DependencyObject dp)
    {
        return (string)dp.GetValue(PasswordProperty);
    }

    public static void SetPassword(DependencyObject dp, string value)
    {
        dp.SetValue(PasswordProperty, value);
    }

    private static bool GetIsUpdating(DependencyObject dp)
    {
        return (bool)dp.GetValue(IsUpdatingProperty);
    }

    private static void SetIsUpdating(DependencyObject dp, bool value)
    {
        dp.SetValue(IsUpdatingProperty, value);
    }

    private static void OnPasswordPropertyChanged(DependencyObject sender,
        DependencyPropertyChangedEventArgs e)
    {
        PasswordBox passwordBox = sender as PasswordBox;
        passwordBox.PasswordChanged -= PasswordChanged;
       
        if (!(bool)GetIsUpdating(passwordBox))
        {
            passwordBox.Password = (string)e.NewValue;
        }
        passwordBox.PasswordChanged += PasswordChanged;
    }

    private static void Attach(DependencyObject sender,
        DependencyPropertyChangedEventArgs e)
    {
        PasswordBox passwordBox = sender as PasswordBox;

        if (passwordBox == null)
            return;

        if ((bool)e.OldValue)
        {
            passwordBox.PasswordChanged -= PasswordChanged;
        }
   
        if ((bool)e.NewValue)
        {
            passwordBox.PasswordChanged += PasswordChanged;
        }
    }

    private static void PasswordChanged(object sender, RoutedEventArgs e)
    {
        PasswordBox passwordBox = sender as PasswordBox;
        SetIsUpdating(passwordBox, true);
        SetPassword(passwordBox, passwordBox.Password);
        SetIsUpdating(passwordBox, false);
    }
}

PasswordHelper sınıfı yardımı ile PasswordBox kontrolünün yetkinliklerini ve güvenlik özelliklerini fazlası ile arttırabilmemiz mümkündür. Bu arada bu sınıfı hazırlayan functional blog grubuna da teşekkürlerimizi sunuyoruz.

Sonuç olarak PasswordBox kontrolünü kullanmak istediğimizde neler yapabileceğimize detaylı bir şekilde değinmeye çalıştık. Ayrıca DataBinding işlemleri esnasında bu kontrolün yeterince güvenli olmadığını ve kendi PasswordHelper sınıfını oluşturarak daha güvenlikli bir hale nasıl getirebileceğimize değinmeye çalıştık.

Umarım yararlı olabilmiştir.

Perşembe, Ekim 22, 2009

WPF - DataGrid Pratikleri

Windows Presentation Foundation ile ilgili kontrolleri özellikle de .Net Framework 4.0 ile çok daha sık kullanacak olduklarımızı incelmeye devam ediyoruz. Bir önceki yazımızda WPF DataGrid kontrolünün nasıl kullanabileceğini ve özelliklerinden nasıl yararlanabileceğimizi anlatmaya çalışmıştık. Bu yazımızda yine DataGrid kontrolünü incelerken detaylı bir şekilde proje geliştirme esnasında DataGrid kontrolünü nasıl kullanabileceğimizi açıklamaya çalışıyor olacağız.

Son kullanıcıya veri göstermek istenildiğinde akla gelen ilk kontrollerdendir DataGrid kontrolü.  Asp.Net uygulamalarında DataGrid, Windows Form uygulamalarında DataGridView kontrolü olarak geçmektedir. Ayrıca  üçüncü parti kontrol geliştiren yazılım firmalarınında ilk olarak değindikleri ve özelleştirdikleri kontroldür. Bu durumda bu kontrolün WPF ilk çıktığı zamanlarda bileşen panelinin içerisinde yer almaması oldukça büyük bir eksiklik olarak hissediliyordu. .Net Framework 3.5 'in SP1 sürümünün çıkması ve sonrasında WPF Toolkitin iyice kullanılabilir hale gelmesi ile WPF için yeni yeni kontroller geliştiricilere sunulmaya başladı. Bu geliştirilen kontrollerden şu anda için en sık kullanılan DataGrid, DateTimePicker ve Calendar kontrolleri özelleştirilebilir halleri ile .Net Framwork bünyesine de eklenmiştir. Zaman içerisinde kontrol panelinin içeriğinin artacağından kimsenin şüphesi yoktur.

Peki DataGrid kontrolünü VS2010 ile kullanırken herşey çok kolay. Zaten Toolbar içerisinde ekli olan bütün kontroller yer almaktadır. Peki ben geliştirme işlemini VS2008 içerisinde yapacağım, hem de WPF içerisinde DataGrid kontrolleri kullanmak istiyorum dersek neler yapmamız gerekiyor. Alt kısımlarda verecek olduğumuz linklerden yararlanarak kullanabilirsiniz. O zaman ilk olarak VS2008 ile neler yapmak gerekmektedir. Bu konulara değindikten sonra DataGrid pratiklerini incelemeye başlayalım.

Visual Studio 2008 içerisinde olmayan WPF kontrollerini kullanmak istediğimizde yapmamız gereken en önemli iş WPF Toolkit 'i kurmak yeterli olacaktır. Çalışmak için gereklilikleri aşağıda ver alan linklerden yararlanarak kurabilmeniz mümkündür.

.Net Framework 3.5 SP1 kurulması gerekmektedir.
WPF Toolkit
• WpfToolkit.msi dosyasını kurduktan sonra WPFToolkit.dll 'i program files dosyasının içerisine ekler. Projeye içerisine referans ederek kullanılabilmesi mümkündür.

Visual Studio 2008 ile anlatmış olduğumuz uygulamayı yapmak istersek nasıl yapabileceğimizi neler gerektiğini açıkladık. Artık uygulamamızı geliştirmeye başlayabiliriz. Bakalım DataGrid kontrolü ile neler yapabileceğiz.

DataGrid kontrolleri içerisinde CRUD (Create-Read-Update-Delete) işlemlerini nasıl yapabileceğimizi açılmaya çalışıyor olacağız. Bu işlem normalde hazırladığımız örneklerden biraz daha farklı olarak DataSet yardımı ile kullanmayı inceleyeceğiz. Uygulama içerisinde Northwind veri tabanından yararlanıyor olacağız. Oluşturacak olduğumuz dataset 'in içerisine aşağıda resimde de gördüğünüz Customers ve Orders tablolarını ekliyoruz.



İlk olarak DataSet 'e eklemiş olduğumuz Customers tablosunu DataGrid kontrolü içerisine ekleyelim. Bunun için ise, XAML sayfanın içerisine DataGrid kontrolünü ekledikten sonra ItemSource değerine {Binding} değerini atıyoruz.

Windows1.xaml
<Window x:Class="DataGridPratikleri.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Northwindler" Height="231" Width="500">

    <Grid>
        <DataGrid ItemsSource="{Binding}" Height="193" HorizontalAlignment="Left" Name="dataGrid1" VerticalAlignment="Top" Width="478" />
    </Grid>
</Window>


WPF uygulamasına DataGrid kontrolünü ekledik. Şimdi ise DataSet içerisine eklemiş olduğumuz tabloları kullanarak otomatik olarak oluşturulan veri getirme fonksiyonundan yararlanarak verileri gösterelim. Table Adapter yardımı ile

Windows1.xaml.cs

public Window1()
{
    InitializeComponent();

    DataSet1 dataset = new DataSet1();

    CustomersTableAdapter adapter = new CustomersTableAdapter();
    adapter.Fill(dataset.Customers);

    this.DataContext = dataset.Customers.DefaultView;
}


Verileri görüntüleyebilmek için gerekli işlemleri gerçekleştirdik. Yapmamız gereken son işlem ise Grid içerisine yerleşecek olan kolonlar otomatik olarak ekleneceği için AutoGenereteColumns özelliğine True değerini atamak olacaktır. Sonrasında ise aşağıdaki gibi bir görünüme sahip oluruz.



Yapmış olduğumuz işlemler sonrasında DataGrid içerisinde verilerin sorunsuzca gözüktüğünü gözlemledik. DataGrid içerisinde gösterilen verilerin satır ve sütunlarının otomatik olarak oluşturuluyor. Ayrıca bu otomatik oluşturulma işleminin dışında bizlerde DataGrid kontrolü üzerinde sağ tıklama yaptıktan sonra karşımıza çıkan menüden DataGrid seçeneğinin altında yer alan Add/Edit yardımı ile gerekli düzenlemeleri yapabiliriz. Ancak unutulmaması gereken bir konu, verileri otomatik olarak oluşturduğumuz için bu seçenek içerisinde şu anda bir deneme yaptığınızda herhangi bir değer çıkmayacaktır.

Veri kontrolüni sağlanabileceği bir başka yöntem ise ObjectDataProvider kullanımıdır. Bu sınıf yardımı ile XAML içerisinde veri kaynağı olarak kullanılacak olan örnekleri sağlamaya yardımcı olur. Bı işlem sonrasında da denetimleri veri kaynağı üzerinde yaptırabilme olanağı da vardır. (Not:İlerleyen yazılarımızda ObjectDataProvider kullanımı detayları ile açıklayacağız.)

ObjectDataProvider 'i kullanacağımız CustomerDataProvider isimli sınıfı oluşturarak işlemlerimize başlıyoruz. Bu sınıf içerisinde DataSet içerisinde yer alan objelerden de yararlanıyor olacağız.


public class CustomerDataProvider
{
    private CustomersTableAdapter adapter;
    private DataSet1 dataset;

    public CustomerDataProvider()
    {
        dataset = new DataSet1();
        adapter = new CustomersTableAdapter();
        adapter.Fill(dataset.Customers);
    }

    public DataView GetCustomers()
    {
        return dataset.Customers.DefaultView;
    }
}


Projenin içerisine yeni bir sınıf ekleyiruz ve yazmış olduğumuz kod bloklarının ObjectDataProvider ile uyumlu olması için yukarıda da görmüş olduğunuz kod parçacıklarını ekledik.. Şimdi sıra XAML kod tarafının içeriğini bu yapı ile çalışabilecek duruma getirmemiz gerekmektedir.

Windows1.xaml

<Window ...
    <Window.Resources>
        <!-- create an instance of our DataProvider class -->
        <ObjectDataProvider x:Key="CustomerDataProvider"
                ObjectType="{x:Type local:CustomerDataProvider}"/>
        <!-- define the method which is invoked to obtain our data -->
        <ObjectDataProvider x:Key="Customers"
                ObjectInstance="{StaticResource CustomerDataProvider}"
                MethodName="GetCustomers"/>
    </Window.Resources>
    <DockPanel DataContext="{Binding Source={StaticResource Customers}}">
        <DataGrid Name="dataGrid" ItemsSource="{Binding}" />
    </DockPanel>
<Window>


XAML tarafında ki düzenlemeleri de tamamladıktan sonra dizayn kısmına gereken DataGrid 'in üzerine sağ tıklama yaptığımız da DataGrid menüsünün altında yer alan seçeneklerden GenerateColumns,Add/EditColumns ve Remove Columns seçenekleri yer alacaktır. Bunlardan GenerateColumns seçeneğini seçersek bize DataBound kullanılacak şekilde bütün kolonları belirler. Tabii bu işlemi ObjectDataProvider kullandığımız için yapabiliyoruz. Biraz önceki kontrolümüzde bu seçenekler yer almıyordu. Ayrıca Add/Edit columns seçeneğine tıkladığımızda ilk etapta hiç bir değer gelmeyecektir. Ancak ASP.NET uygulamalarında kullanmış olduğumuz DataGrid konrollerinden de alışık olduğumuz gibi kolonları buradan düzenleyebilmemiz, tipini belirleyebilmemiz mümkündür. Bu açıkladığımız bilgileri görsel olarak görmek gerekirse, ekran görüntüleri aşağıdaki gibi olacaktır.



Add/Edit Columns seçeneğine tıkladıktan sonra herhangi bir kontrol ekleyip düzenle dediğimizde ise aşağıdaki gibi bir görüntü ile karşılaşırız.



Sizlerinde de fark etmiş olacağınız gibi Asp.Net uygulamalarında kullanmış olduğumuz yöntemlerin benzerlerini WPF uygulamalarında da kullanabilmemiz mümkün durumdadır. Bu ekran yardımı ile yapmış olduğunuz değişikler sonrasında XAML kod tarafında DataBound edilebilecek şekilde kolon bilgilerinin eklendiğini gözlemleyebilirsiniz.

Güncelleme İşlemleri
DataGrid kullanılan uygulamalarda son kullanıcılargenellikle Grid içerisinde yer alan kolonlara girmiş oldukları değelerin kayıt olabilmesini istemektedirler. DataTable içerisinde veri gösterildiği için son kullanıcı tarafından yapılan bu değişiklikleri farklı yötemler ile veri tabanına kayıt edebilmemiz mümkündür. Örnek olarak biraz anlatmak gerekirse, kullanabileceğimiz yöntemlerden biri bütün değişiklieri yapmak ve sonrasında misal olarak sonlandır isimli bir buton ile bütün değişikleri kaydebiliriz. Ya da her değişiklik yapıldığı anda da DataTable üzerinde kayıt işleminin yapılabilmesi mümkündür.

Satır üzerinde yapılan değişikleri yakalayabilmek için DataTable 'in RowChanged ve RowDeleted olaylarından yararlanabiliriz. Bu işlemler sonrasında istediğimiz işlemleri sorunsuzca yaptırabilir duruma geliyoruz.

CustomerDataProvider sınıfını oluşturduğumız sınıfın içeriğini aşağıdaki gibi olacak şekilde güncelliyoruz. Bu güncelleme işleminde DataSet 'i de bir ObjectDataProvider olarak tanımlıyoruz. Ayrıca RowChanged ve RowDeleted olaylarını da yakalayarak güncelleme işleminin yapılmasını sağlıyoruz.

Günceleme işlemi için ilk olarak yapacağımız DataSet bağlantısını da ObjectDataProvider yapısına uydurmak olacaktır. Sonrasında ise CustomerDataProvider isimli sınıfımız içerisinde güncelleme işleminin yapılabilmesi için bir takım değişikler yapacağız. Yapmış olduğumuz değişiklikler sonrasında DataGrid içerisinde yapılan herhangi değişiklik sonrasında başka bir kolona geç dediğimiz anda değişiklikler veri tabanında güncellenmiş olacktır. Sınıfın içerisindeki değişiklik aşağıdaki gibidir.

Windows1.xaml

using Test.DataSet1TableAdapters;
using System.Data;

namespace Test
{
    public class NorthWindDataProvider
    {
        private static DataSet1 northwindDataSet;

        public static DataSet1 NorthwindDataSet
        {
            get
            {
                if (northwindDataSet == null)
                {
                    northwindDataSet = new DataSet1();
                }
                return NorthWindDataProvider.northwindDataSet;
            }
        }
    }
    public class CustomerDataProvider
    {
        private CustomersTableAdapter adapter;

        public CustomerDataProvider()
        {
            DataSet1 dataset = NorthWindDataProvider.NorthwindDataSet;

            adapter = new CustomersTableAdapter();
            adapter.Fill(NorthWindDataProvider.NorthwindDataSet.Customers);

            dataset.Customers.CustomersRowChanged += new DataSet1.CustomersRowChangeEventHandler(CustomerRowModified);
            dataset.Customers.CustomersRowDeleted +=new DataSet1.CustomersRowChangeEventHandler(CustomerRowModified);

        }

        void CustomerRowModified(object sender, DataSet1.CustomersRowChangeEvent e)
        {
            adapter.Update(NorthWindDataProvider.NorthwindDataSet.Customers);
        }

        public DataView GetCustomers()
        {
            return NorthWindDataProvider.NorthwindDataSet.Customers.DefaultView;
        }
    }
}


Değişikliğimiz sonrasında XAML kod bölümünde herhangi bir değişiklik yapmıyoruz. Uygulamamızı çalıştırıp değişiklikleri tamamladıktan sonra tekrardan uygulamamızı çalıştırdığımızda değişikliklerin kaydolduğunu ve DataGrid içerisinde yeni değerinin yer aldığını gözlemleriz.

Sonuç olarak DataGrid içerisinde veri tabanında yer alan verileri göstermeyi ve üzerinde değişiklik yapmak istediğimiz zaman hangi işlemleri uygulamayacağımızı anlatmaya çalıştık.

Umarım yararlı olabilmiştir.
Kaynak
www.windowsclient.com

Salı, Mart 24, 2009

YazGeliştir Seminerleri @İstanbul - Yıldız Teknik Üniversitesi

Merhabalar,

Benim konuşmacıları arasında olduğum Yazgelistir ekibi 28 Mart Cumartesi günü Yıldız Teknik Üniversitesinde olacağız. Benim anlatacağım konu Windows Presentation Foundation. Etkinlik ile ilgili duyuruyu yazının devamında okuyabilirsiniz. Katılımlarınızı büyük bir merak ve heyacanla bekliyoruz…

Duyuru;

Yazgeliştir, 2009 seminer turuna Yıldız Teknik Üniversitesi'nden devam ediyor. 28 Mart 2009 Cumartesi günü tüm gün sürecek olan, altı konuşmacının yedi ayrı konuyu anlatacağı seminerlerde sizde yerinizi alın!
Etkinlik Tarihi: 28 Mart 2009 Cumartesi

Etkinlik Programı:

09:30-10:15:    Mustafa Acungil - İş zekası nedir?
10:15-10:30:    ARA
10:30-11:15:    Mustafa Acungil - SQL Server 2008 İle Gelen Yeni Veri Tipleri
11:15-11:30:    ARA
11:30-12:15:    Volkan Korkmaz - Dynamics CRM 4.0
12:15-13:00:    YEMEK ARASI
13:00-13:45:    Turhal Temizer - Windows Presentation Foundation
13:45-14:00:    ARA
14:00-14:45:    Burak Batur - Microsoft Office SharePoint Server 2007
14:45-15:00:    ARA
15:00-15:45:    Daron Yöndem - MultiPoint Programlama
15:45-16:00:    ARA
16:00-16:45:    Emre Coşkun - Composite WPF

Etkinlik Yeri :
Yıldız Teknik Üniversitesi Beşiktaş Kampüsü, YTÜ C Blok Konferans Salonu