Makale Özeti

Visual Studio ile uygulama geliştirmenin bu kadar hızlı ve kolay hale gelmesinde en büyük payı olan bileşenlerden biri PropertyGrid kontrolü. Bu yazımızda herhangi bir nesneyi seçtiğimizde onun özelliklerinin görüntülendiği kontrolden ve PropertyGrid kontrolünü kendi uygulamalarımız için nasıl özelleştirebileceğimizden bahsediyor olacağız.

Makale

Visual Studio ile uygulama geliştirmenin bu kadar hızlı ve kolay hale gelmesinde en büyük payı olan bileşenlerden biri PropertyGrid kontrolü. Bu yazımızda herhangi bir nesneyi seçtiğimizde onun özelliklerinin görüntülendiği kontrolden ve PropertyGrid kontrolünü kendi uygulamalarımız için nasıl özelleştirebileceğimizden bahsediyor olacağız. 

Giriş paragrafındada belirttiğimiz gibi PropertyGrid kontrolü Visual Studio ile uygulama geliştirmemizi son derece kolaylaştıran ve artık yokluğunu yadırgayacak derecede alıştığımız, seçtiğimiz nesneye ait özellikleri reflection metodunu kullanarak listeleyen kontroldür. (Reflection için tür bilgisini runtime esnasında edinmemizi sağlayan metot, teknoloji diyebiliriz.) Şekil 1.1de PropertyGrid kontrolünün form üzerindeki görünümün görebilirsiniz:


Şekil: 1.1

PropertyGrid kontrolü aşağıdaki bölümlerden oluşur:
    - Özellikler
    - Genişleyebilir Özellikler
    - Özellik Katalog Başlıkları
    - Özellik Açıklamaları
    - Özellik Editörleri
    - Özellik Sekmeleri
    - Komut Panosu

PropertyGrid Kontrolünün Oluşturulması
Visual Studio.NETte PropertyGrid kontrolü varsayılan olarak Windows Forms kontrolleri arasında görüntülenmez. PpropertyGrid kontrolünü kullanabilmek için Tools menüsünden Custumize Toolbox komutunu daha sonra Framework Components sekmesini seçerek listeden PropertyGrid kontrolünü seçmelisiniz. Aşağıdaki kod örnekleri, C# ve VB.NET dillerinde bir PropertyGrid kontrolünün nasıl oluşturularak form üzerine ekleneceğini göstermektedir:

Visual Basic
Imports System
Imports System.Drawing
Imports System.ComponentModel
Imports System.Windows.Forms
Imports System.Globalization

Public Class OptionsDialog
Inherits System.Windows.Forms.Form

Private PropertyGrid1 As System.Windows.Forms.PropertyGrid

Public Sub New()
MyBase.New()

PropertyGrid1 = New PropertyGrid()
PropertyGrid1.Size = New Size(300, 250)

Me.Controls.Add(PropertyGrid1)
Me.Text = "Özellikler"
End Sub
End Class


//C#
using System;
using System.Drawing;
using System.ComponentModel;
using System.Windows.Forms;
using System.Globalization;

public class OptionsDialog : System.Windows.Forms.Form
{
private System.Windows.Forms.PropertyGrid PropertyGrid1;
public OptionsDialog()
{
PropertyGrid1 = new PropertyGrid();
PropertyGrid1.Size = new Size(300, 250);

this.Controls.Add(PropertyGrid1);
this.Text = "Özellikler";
}

[STAThread]
static void Main()
{
Application.Run(new OptionsDialog());
}
}

PropertyGrid Kontrolünü Nerelerde Kullanabiliriz? 
Aslında kısaca düşünecek olursak PropertyGrid kontrolünü kullanabileceğimiz sayısız durum olduğunu görebiliriz. Örneğin pek çok ayarlama veya seçeneği olan bir uygulamamız olduğunu varsayalım. Bu özellikleri belirtmek ve kullanıcının ayarlamaları istediği şekilde yapabilmesini sağlamak için onlarca radio button, textbox, combobox vb. kullanabilirsiniz ancak bunların yerine tek bir PropertyGrid kontrolünü kullanarak kullanıcıya gerekli ayarlamaları yapma imkanı verebilirsiniz. Yukarıda oluşturduğumuz OptionsDialog formunu temel alarak küçük bir örnek uygulama geliştirelim. İlk olarak tüm uygulama seçeneklerini belirten özellikleri içeren AppSettings adlı bir sınıf oluşturacağız. Tüm özellikleri tek bir sınıf altında toplamak (bana göre) özellikleri ayrı ayrı değişkenlerde tutmaktan daha kolay ve kullanışlı bir yöntem..

Visual Basic
Public Class AppSettings
Private _saveOnClose As Boolean = True
Private _KarsilamaMetni As String = "Hoşgeldiniz!"
Private _maxRepeatRate As Integer = 10
Private _itemsInMRU As Integer = 4

Private _settingsChanged As Boolean = False
Private _appVersion As String = "1.0"

Public Property SaveOnClose() As Boolean
Get
Return _saveOnClose
End Get
Set(ByVal Value As Boolean)
SaveOnClose = Value
End Set
End Property

Public Property KarsilamaMetni() As String
Get
Return _KarsilamaMetni
End Get
Set(ByVal Value As String)
_KarsilamaMetni = Value
End Set
End Property

Public Property ItemsInMRUList() As Integer
Get
Return _itemsInMRU
End Get
Set(ByVal Value As Integer)
_itemsInMRU = Value
End Set
End Property

Public Property MaxRepeatRate() As Integer
Get
Return _maxRepeatRate
End Get
Set(ByVal Value As Integer)
_maxRepeatRate = Value
End Set
End Property

Public Property SettingsChanged() As Boolean
Get
Return _settingsChanged
End Get
Set(ByVal Value As Boolean)
_settingsChanged = Value
End Set
End Property

Public Property AppVersion() As String
Get
Return _appVersion
End Get
Set(ByVal Value As String)
_appVersion = Value
End Set
End Property
End Class


//C#
public class AppSettings{
private bool saveOnClose = true;
private string KarsilamaMetni = "Hoşgeldiniz!";
private int itemsInMRU = 4;
private int maxRepeatRate = 10;
private bool settingsChanged = false;
private string appVersion = "1.0";

public bool SaveOnClose
{
get { return saveOnClose; }
set { saveOnClose = value;}
}
public string KarsilamaMetni
{
get { return KarsilamaMetni; }
set { KarsilamaMetni = value; }
}
public int MaxRepeatRate
{
get { return maxRepeatRate; }
set { maxRepeatRate = value; }
}
public int ItemsInMRUList
{
get { return itemsInMRU; }
set { itemsInMRU = value; }
}
public bool SettingsChanged
{
get { return settingsChanged; }
set { settingsChanged = value; }
}
public string AppVersion
{
get { return appVersion; }
set { appVersion = value; }
}
}

PropertyGrid kontrolümüz bu sınıfı kullanarak tanımladığımız özellikleri görüntüleyecektir. Ancak henüz değil. Yapmamız gereken bir şey daha var..

Bir nesnenin seçimi
PropertyGrid kontrolünün form üzerinde bulunması pek işimize yaramıyor. Elbette seçtiğimiz nesneye ait özellikleri görüntülemesi gerekir. Bunu PropertyGrid.SelectedObject özelliğini kullanarak gerçekleştiriyoruz. SelectedObject özelliğini her değiştirdiğimizde, PropertyGrid kontrolü belirttiğimiz nesneye ait özellikleri gösterecektir. Özellikleri yenilemek için aynı zamanda PropertyGrid.Refreh metodunuda kullanabiliriz.

Örnek uygulamamıza devam edelim. Şu anki haliyle bir formumuz mevcut, runtime esnasında form üzerinde bir propertygrid kontrolü oluşturuluyor ve uygulamamıza ait özellikleri tanımladığımız AppSettings adlı bir sınıfımız var. Ancak PropertyGrid kontrolümüz uygulamamızın özelliklerini henüz görüntülemiyor. Bunu yapabilmesi için kodumuzu aşağıdaki şekilde değiştirmemiz gerekiyor.

Visual Basic
Public Sub New()
MyBase.New()

PropertyGrid1 = New PropertyGrid()
PropertyGrid1.Size = New Size(300, 250)

Me.Controls.Add(PropertyGrid1)
Me.Text = "Seçenekler"

AppSettings sınıfını oluşturarak PropertyGrid kontrolünde görüntülüyoruz.
Dim appset as AppSettings = New AppSettings()
PropertyGrid1.SelectedObject = appset
End Sub


//C#
public OptionsDialog()
{
PropertyGrid1 = new PropertyGrid();
PropertyGrid1.Size = new Size(300, 250);

this.Controls.Add(PropertyGrid1);
this.Text = "Options Dialog";

AppSettings sınıfını oluşturarak PropertyGrid kontrolünde görüntülüyoruz.
AppSettings appset = new AppSettings();
PropertyGrid1.SelectedObject = appset;
}

Şimdi uygulamamızı compile ederek çalıştırdığımızda:   


Şekil: 1.2

AppSettings Sınıfı PropertyGridde görüntüleniyor..

PropertyGrid Kontrolünün Özelleştirilmesi
PropertyGrid kontrolünün bazı görsel özelliklerini isteklerimiz doğrultusunda değiştirebiliriz. Örneğin bazı özelliklerin görüntülenmesini, bazı özelliklerin görüntülenmemesini isteyeğizdir muhtemelen.. Peki ama nasıl?..

PropertyGrid Kontrolünün Görsel Özelliklerinin Değiştirilmesi
Aslında nasıl sorusunu cevaplamadan önce neler sorusunu cevaplamamız gerekiyor. Neleri değiştirebiliriz?..

    - Arkaplan, yazıtipi renklerini ve açıklama panelinin renklerini değiştirebiliriz.
    - Toolbarın toolbarvisible özelliğini kullanarak görüntülenmesini veya gizlenmesini sağlayabilir veya BackColor özelliğini kullanarak rengini değiştirebilir veya KargeButtons özelliğini kullanarak büyük butonların kullanılmasını (veya kullanılmamasını) sağlayabiliriz.
    - Özellikleri alfabetik olarak sıralayabilir ve PropertySort özelliği ile kategorize edebiliriz.
    - Grid çizgi ve kenarlıklarını LineColor özelliği ile değiştirebiliriz.

Bizim örnek uygulamamızda toolbara ihtiyacımız yok,, dolayısıyla ToolbarVisible özelliğini False olarak ayarlıyoruz.

Özelliklerin Görüntülenmesi ile ilgili Seçenekler
Örnek uygulamamızı biraz daha geliştirelim ve özelliklere farklı öznitelikler vererek görüntülenme biçimlerinde değişiklikler yapalım. Ancak bunu yapmadan önce kullanabileceğimiz öznitelikleri ve ne işe yaradıklarını inceleyelim:

    - DescriptionAttribute: Seçilen özellik için açıklama panelinde görüntülenecek metni tanımlar. Özelliklerle ilgili açıklama yapmak için son derece faydalı bir yöntem..
    - CategoryAttribute: Seçili özelliğin grid üzerinde hangi kategoride görüntüleneceğini tanımlar. Eğer bir özelliğin hangi kategoride görüntüleneceğini tanımlamazsanız (bizim örnek uygulamamızın şu anki halinde olduğu gibi) özellik Misc. kategorisi altında görüntülenir.
    - BrowsableAttribute: Özelliğin grid üzerinde görüntülenip görüntülenmeyeceğini belirler. Bir özelliğin grid üzerinde görüntülenmemesini istiyorsanız bu özniteliği kullanabilirsiniz.
    - ReadOnlyAttribute: Özelliğin salt-okunur olmasını sağlar. Herhangi bir özelliğin grid üzerinde görüntülenmesini istediğiniz ancak değiştirilmesini istemediğiniz durumlarda kullanabilirsiniz.
 
    - DefaultValueAttribute:
Özelliğin varsayılan değerini tanımlar.
    - DefaultPropertyAttribute:
Sınıf için varsayılan özelliği tanımlar. Sınıf seçildiğinde ilk olarak aktif hale getirilecek özelliği buradan belirleyebilirsiniz.

Şimdi bu özniteliklerden bazılarını kullanarak örnek uygulamamızı biraz daha geliştirelim:

Visual Basic
<DefaultPropertyAttribute("SaveOnClose")> _
Public Class AppSettings
Private _saveOnClose As Boolean = True
Private _KarsilamaMetni As String = "Hoşgeldiniz!"
Private _maxRepeatRate As Integer = 10
Private _itemsInMRU As Integer = 4

Private _settingsChanged As Boolean = False
Private _appVersion As String = "1.0"

<CategoryAttribute("Dokuman Seçenekleri"), _
DefaultValueAttribute(True)> _
Public Property SaveOnClose() As Boolean
Get
Return _saveOnClose
End Get
Set(ByVal Value As Boolean)
SaveOnClose = Value
End Set
End Property

<CategoryAttribute("Genel Seçenekler"), _
ReadOnlyAttribute(True), _
DefaultValueAttribute("Hoşgeldiniz!")> _
Public Property KarsilamaMetni() As String
Get
Return _KarsilamaMetni
End Get
Set(ByVal Value As String)
_KarsilamaMetni = Value
End Set
End Property

<CategoryAttribute("Genel Seçenekler"), _
DefaultValueAttribute(4)> _
Public Property ItemsInMRUList() As Integer
Get
Return _itemsInMRU
End Get
Set(ByVal Value As Integer)
_itemsInMRU = Value
End Set
End Property

<BrowsableAttribute(False),
DefaultValueAttribute(False)> _
Public Property SettingsChanged() As Boolean
Get
Return _settingsChanged
End Get
Set(ByVal Value As Boolean)
_settingsChanged = Value
End Set
End Property

<CategoryAttribute("Sürüm"), _
DefaultValueAttribute("1.0"), _
ReadOnlyAttribute(True)> _
Public Property AppVersion() As String
Get
Return _appVersion
End Get
Set(ByVal Value As String)
_appVersion = Value
End Set
End Property
End Class


//C#
[DefaultPropertyAttribute("SaveOnClose")]
public class AppSettings{
private bool saveOnClose = true;
private string KarsilamaMetni = "Hoşgeldiniz!";
private int maxRepeatRate = 10;
private int itemsInMRU = 4;

private bool settingsChanged = false;
private string appVersion = "1.0";

[CategoryAttribute("Dokuman Seçenekleri"),
DefaultValueAttribute(true)]
public bool SaveOnClose
{
get { return saveOnClose; }
set { saveOnClose = value;}
}

[CategoryAttribute("Genel Seçenekler"),
ReadOnlyAttribute(true),
DefaultValueAttribute("Hoşgeldiniz!")]
public string KarsilamaMetni
{
get { return KarsilamaMetni; }
set { KarsilamaMetni = value; }
}

[CategoryAttribute("Genel Seçenekler"),
DefaultValueAttribute(4)]
public int ItemsInMRUList
{
get { return itemsInMRU; }
set { itemsInMRU = value; }
}

[BrowsableAttribute(false),
DefaultValueAttribute(false)]
public bool SettingsChanged
{
get { return settingsChanged; }
set { settingsChanged = value; }
}

[CategoryAttribute("Sürüm"),
DefaultValueAttribute("1.0"),
ReadOnlyAttribute(true)]
public string AppVersion
{
get { return appVersion; }
set { appVersion = value; }
}
}

Sınıfımız üzerinde yukarıdaki değişiklikleri yaptıktan sonra compile ederek çalıştırdığımızda sonuç aşağıdaki şekilde olacaktır:


Şekil: 1.3

Sınıfımız üzerinde yaptığımız değişiklikler sonrasında kodumuzu compile ettiğimizde uygulamamızdaki farklılıkları şöyle listeleyebiliriz:
    - Uygulamamız çalıştığı anda
SaveOnClose özelliği aktif hale gelmiştir.
    - SaveOnClose seçenekleri
Dokuman Seçenekleri kategorisi altında görüntülenmektedir. Diğer özellikler ise Sürüm ve Genel Seçenekler adlı iki farklı kategori altında görüntülenmektedir.
    -
SettingsChanged özelliği görüntülenmemektedir.
    -
AppVersion özelliği salt okunur hale geldi. Kullanıcı bu özelliği değiştiremiyor.
    -
SaveOnClose özelliği true dışında bir değer aldığında kalın metin ile görüntüleniyor. PropertyGrid kontrolü kalın metni özellikler varsayılan dışında bir değer aldığında kullanır.


Yazımızın ilk bölümünün sonuna geldik. İkinci bölümde PropertyGrid kontrolünün boyut, yazıtipi, renk gibi gelişmiş özelliklerin kullanımını, kullanıcı tanımlı veri türlerinin ve kullanıcı tarafından genişletilebilen özelliklerin kullanımı gibi gelişmiş özelliklerini inceliyor olacağız..