wmismail Posted August 10, 2008 Share Posted August 10, 2008 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.. Link to comment Share on other sites More sharing options...
wmismail Posted August 10, 2008 Author Share Posted August 10, 2008 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. Ş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; Ş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 More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.