Jump to content

Propertygrid Kontrolünün Özelleştirilmesi (1 / 2)


wmismail

Recommended Posts

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:

kadir_propertygrid_1.gif

Ş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:

kadir_propertygrid_2.gif

Ş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:

kadir_propertygrid_3.gif

Ş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..

Link to comment
Share on other sites

Makalemizin ilk bölümünde PropertGrid kontrolünün sağladığı kolaylıkları inceleyerek örnek bir adım adım örnek bir uygulama geliştirmiştik. Makalemizin ikinci ve son bölümünde ise örnek uygulamamızı biraz daha geliştirirken, propertyGrid kontrolünde Pencere boyutu, renkler ve yazıtipi gibi gelişmiş özellikleri nasıl görüntüleyebileceğimizi, kullanıcı tanımlı türlerin kullanımını göreceğiz.

Gelişmiş Özelliklerin Görüntülenmesi

Şimdiye kadar örnek uygulamamız sadece basit metinsel, boolean veya sayısal değerleri görüntüledi. Peki daha gelişmiş özellikleri, örneğin toolbar rengini, pencere boyutunu veya yazıtipini görüntülemek istersek? .NET Framework tarafından sunulan bazı veri türleri PropertyGrid kontrolü tarafından daha kolay kullanılabilmelerini sağlayan özel görüntüleme özelliklerine sahiplerdir. Örnek uygulamamızı geliştirerek bu veri tiplerini ve özelliklerini inceleyelim:

İlk olarak sınıfımızı window size (Size türü), window font (Font türü) ve toolbar rengi (Color türü) özelliklerini içerecek şekilde güncelleyelim..

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"

Private _windowSize As Size = New Size(100, 100)

Private _windowFont As Font = New Font("Trebuchet MS", 8, FontStyle.Regular)

Private _toolbarColor As Color = SystemColors.Control

<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("Dokuman Seçenekleri")> _

Public Property WindowSize() As Size

Get

Return _windowSize

End Get

Set(ByVal Value As Size)

_windowSize = Value

End Set

End Property

<CategoryAttribute("Dokuman Seçenekleri")> _

Public Property WindowFont() As Font

Get

Return _windowFont

End Get

Set(ByVal Value As Font)

_windowFont = Value

End Set

End Property

<CategoryAttribute("Global Seçenekler")> _

Public Property ToolbarColor() As Color

Get

Return _toolbarColor

End Get

Set(ByVal Value As Color)

_toolbarColor = Value

End Set

End Property

<CategoryAttribute("Global 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 greetingText = "Hoşgeldiniz!";

private int maxRepeatRate = 10;

private int itemsInMRU = 4;

private bool settingsChanged = false;

private string appVersion = "1.0";

private Size windowSize = new Size(100,100);

private Font windowFont = new Font("Trebuchet MS", 8, FontStyle.Regular);

private Color toolbarColor = SystemColors.Control;

[CategoryAttribute("Dokuman Seçenekleri"),

DefaultValueAttribute(true)]

public bool SaveOnClose

{

get { return saveOnClose; }

set { saveOnClose = value;}

}

[CategoryAttribute("Dokuman Seçenekleri")]

public Size WindowSize

{

get { return windowSize; }

set { windowSize = value;}

}

[CategoryAttribute("Dokuman Seçenekleri")]

public Font WindowFont

{

get {return windowFont; }

set { windowFont = value;}

}

[CategoryAttribute("Genel Seçenekler")]

public Color ToolbarColor

{

get { return toolbarColor; }

set { toolbarColor = value; }

}

[CategoryAttribute("Genel Seçenekler"),

ReadOnlyAttribute(true),

DefaultValueAttribute("Hoşgeldiniz!")]

public string GreetingText

{

get { return greetingText; }

set { greetingText = 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ızda yukarıdaki değişikliği gerçekleştirdikten sonra uygulamamız artık .NET Framework tarafından sunulan özel veri türleri aracılığıyla, boyut, yazıtipi ve renk seçeneklerinide sunuyor.

kadir_propertygrid_4.gif

Şekil: 1.4

Özel Veri Türleri

Şimdi sınıfımıza VarsayilanDosyaAdi ve YazimDenetimSecenekleri adlı iki özellik daha ekliyoruz. VarsayilanDosyaAdi özelliği bir metinsel ifade alacak veya belirtecek, YazimDenetimSecenekleri özelliği ise YazimDenetimi sınıfının bir örneğini.

YazimDenetimi sınıfı uygulamamızın imla denetim özelliklerini yönetecek yeni sınıfımızın adı. Bir nesnenin özelliklerini yönetmek için ayrı bir sınıf oluştururken herhangi bir kesin kural yoktur. Şimdi formumuzun içine (ben boyle yapıyorum) veya ayrı bir dosyaya sınıfımızı ekleyelim.

Visual Basic

<DescriptionAttribute("Uygulamanın yazım seçeneklerini görmek için burayı tıklayınız.")> _

Public Class YazimDenetimi

Private _yazarkenDenetle As Boolean = True

Private _CAPSDenetle As Boolean = False

Private _DuzeltmeOner As Boolean = True

<DefaultValueAttribute(True)> _

Public Property YazarkenDenetle() As Boolean

Get

Return _yazarkenDenetle

End Get

Set(ByVal Value As Boolean)

_yazarkenDenetle = Value

End Set

End Property

<DefaultValueAttribute(False)> _

Public Property CAPSDenetle() As Boolean

Get

Return _CAPSDenetle

End Get

Set(ByVal Value As Boolean)

_CAPSDenetle = Value

End Set

End Property

<DefaultValueAttribute(True)> _

Public Property DuzeltmeOner() As Boolean

Get

Return _DuzeltmeOner

End Get

Set(ByVal Value As Boolean)

_DuzeltmeOner = Value

End Set

End Property

End Class

//C#

[DescriptionAttribute("Uygulamanın yazım seçeneklerini görmek için burayı tıklayınız.")]

public class YazimDenetimi{

private bool YazarkenDenetle = true;

private bool CAPSDenetle = false;

private bool DuzeltmeOner = true;

[DefaultValueAttribute(true)]

public bool YazarkenDenetle

{

get { return YazarkenDenetle; }

set { YazarkenDenetle = value; }

}

[DefaultValueAttribute(false)]

public bool CAPSDenetle

{

get { return CAPSDenetle; }

set { CAPSDenetle = value; }

}

[DefaultValueAttribute(true)]

public bool DuzeltmeOner

{

get { return DuzeltmeOner; }

set { DuzeltmeOner = value; }

}

}

Uygulamamızı bu değişiklikleri gerçekleştirdikten sonra compile edip çalıştırdığımızda sonuç aşağıdaki gibi olacaktır;

kadir_propertygrid_5.gif

Şekil: 1.5

Kullanıcı tanımlı veri türlerinin type converter kullanılmadan PropertyGrid kontrolünde kullanımını görmüş olduk. peki ya kendi tanımladığımız türde .NET Framework tarafından sağlanan türlerin benzeri bir düzenleme imkanı sağlamak istersek ne yapmalıyız? .NET Framework bu imkanı sağlamak için TypeConverter ve UITypeEditor sınıflarını kullanmaktadır. Bu isteğimizi gerçekleştirmek için bizim yapmamız gerekende bu sınıfları kullanmaktır..

Genişletilebilir Özellik Desteğinin Eklenmesi

PropertyGrid kontrolü üzerinde Yazım Denetimi özelliğini genişletebilmek için bir TypeConvertera ihtiyacımız var. TypeConverter bir türü diğer bir türe dönüştürmeyi sağlamaktadır. PropertyGrid kontrolü TypeConverter aracılığıyla object türünü, değeri grid üzerinde görüntülemek için string türüne dönüştürmektedir. .NET Framework bu işlemi daha basit hale getirmek için ExpandableObjectConverter sınıfını sunar.

Bu özelliği örnek uygulamamıza devam ederek gösterelim:

İlk olarak ExpandableObjectBrowser sınıfını inherit eden bir sınıf oluşturalım;

Visual Basic

Public Class YazimDenetimiConverter

Inherits ExpandableObjectConverter

End Class

//C#

public class SpellingOptionsConverter:ExpandableObjectConverter

{ }

CanConvertTo metotunu override ederek ve eğer destinationType parametresi sınıfın (converterın) kullandığı tür ile aynıysa true değerini döndürelim.

Visual Basic

Public Overloads Overrides Function CanConvertTo( _

ByVal context As ITypeDescriptorContext, _

ByVal destinationType As Type) As Boolean

If (destinationType Is GetType(YazimDenetimi)) Then

Return True

End If

Return MyBase.CanConvertFrom(context, destinationType)

End Function

//C#

public override bool CanConvertTo(ITypeDescriptorContext context,

System.Type destinationType)

{

if (destinationType == typeof(YazimDenetimi))

return true;

return base.CanConvertTo(context, destinationType);

}

DestinationType parametresinin String olmasını sağlamak için ConvertTo metodunu override ediyor ve sınıfın kullandığı türün type converterın (bizim örneğimizde YazimDenetimi sınıfı) kullandığı tür ile aynı olmasını sağlıyoruz.

Visual Basic

Public Overloads Overrides Function ConvertTo( _

ByVal context As ITypeDescriptorContext, _

ByVal culture As CultureInfo, _

ByVal value As Object, _

ByVal destinationType As System.Type) _

As Object

If (destinationType Is GetType(System.String) _

AndAlso TypeOf value Is YazimDenetimi) Then

Dim so As YazimDenetimi = CType(value, YazimDenetimi)

Return "Yazarken Denetle: " & so.YazarkenDenetle & _

", CAPS denetle: " & so.CAPSdenetle & _

", düzeltme öner: " & so.DuzeltmeOner

End If

Return MyBase.ConvertTo(context, culture, value, destinationType)

End Function

//C#

public override object ConvertTo(ITypeDescriptorContext context,

CultureInfo culture,

object value,

System.Type destinationType)

{

if (destinationType == typeof(System.String) &&

value is YazimDenetimi){

YazimDenetimi so = (YazimDenetimi)value;

return "Yazarken Denetle:" + so.YazarkenDenetle +

", CAPS denetle: " + so.CAPSdenetle +

", düzeltme öner: " + so.DuzeltmeOner;

}

return base.ConvertTo(context, culture, value, destinationType);

}

İsteğe bağlı olarak kullanıcının dropdown listede bulunmayan bir değer belirtmesine izin vermek isteyebiliriz. Bunu yapmak için GetStandartValuesExclusive metodunu override ederek false değerini döndürürüz. Bu işlem dropdown listi bir combobox a dönüştürür ve kullanıcının farklı bir değer belirtmesine izin verir.

Visual Basic

Public Overloads Overrides Function GetStandardValuesExclusive( _

ByVal context As ITypeDescriptorContext) As Boolean

Return False

End Function

//C#

public override bool GetStandardValuesExclusive(

ITypeDescriptorContext context)

{

return false;

}

Artık bir dropdown list görüntülemek için kendi TypeConverterımıza sahibiz ancak işimiz henüz bitmedi. şimdi bu typeconverterı kimin kullanacağını belirtmemiz gerekiyor. Bizim örneğimizde TypeConverterımızı VarsayilanDosyaAdi özelliği kullanacak. Bunun için VarsayilanDosyaAdi özelliğine TypeConverterAttribute özniteliğini eklememiz gerekiyor.

Visual Basic

<TypeConverter(GetType(YazimDenetimiConverter)), _

CategoryAttribute("Dokuman Seçenekleri")> _

Public Property VarsayilanDosyaAdi() As String

Get

Return _VarsayilanDosyaAdi

End Get

Set(ByVal Value As String)

_VarsayilanDosyaAdi = Value

End Set

End Property

//C#

[TypeConverter(typeof(YazimDenetimiConverter)),

CategoryAttribute("Dokuman Seçenekleri")]

public string VarsayilanDosyaAdi

{

get{ return VarsayilanDosyaAdi; }

set{ VarsayilanDosyaAdi = value; }

}

Uygulamamızı yeniden compile ederek çalıştırdığımızda artık VarsayilanDosyaAdi özelliği bir combobox olarak görüntülenecektir.

Bu yazımızda uygulamalarda son derece geniş kullanım alanı olan propertyGrid kontrolü hakkında kısaca bilgi vermeye çalıştık. PropertyGrid kontrolü, çok sayıda form kullanarak ve kod yazarak sağladığımız uygulama özelleştirme işlemlerini son derece kolaylaştırabilir ve uygulamanın farklı noktalarına yoğunlaşmak için daha fazla zamanımız olmasını sağlayabilir.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...