Merhabalar, bu yazı ile geliştirmekte yada geliştirmiş olduğunuz sınıfların bazı özelliklerini ya da bizzat kendisini PropertyGrid nesnesi üzerinden nasıl düzenlenebilir yapabileceğinizi öğrenebilirsiniz. Bilindiği üzere PropertyGrid kontrolü seçilen nesneye ait tüm özellikleri listelemektedir. Uygulamanın tasarım/dizayn aşamasında bu kontrolün kullanımı önemli kolaylıklar sağlamaktadır. Direk koda inmektense bir kaç tıklama ile ilgili nesneye ait değerleri kolaylıkla değiştirebiliyoruz. Peki ya kendi geliştiriğimi nesneler ya da özellikler(property) kendine has bir şekilde property grid kontrolü ile değiştirilebilir hale getirilebilir?
Property Grid
Konuyu biraz daha açıklayabilmek amacıyla bir kaç örnek vermek uygun olacaktır. Örneğin Color sınıfına ait bir özelliği property grid ile değiştirmek istediğinizde ya da WindosState özelliğini değiştirmek istediğiniz de aşağıdaki kutucukları kullanıyoruz.

Color sınıfına ait editör

WindowsState'e ait editör
Arka planda bu işlevi kazandırmak üzere basit bir sınıf üzerinden örneğimizi gerçekleştirelim. Örnek sınıfı ve bu sınıfı özellik olarak kullanan MyCustomClass sınıfı:
Public Class MyDemoClass
Public Property ColorProperty As Color
Public Property NameProperty As String
Public Property CustomClassProperty As MyCustomClass
Sub New()
ColorProperty = Color.Black
NameProperty = "Hello OMR!"
CustomClassProperty = New MyCustomClass()
End Sub
End Class
Public Class MyCustomClass
Public Property NumberOne As Integer = 0
Public Property NumberTwo As Integer = 0
Public ReadOnly Property Multiply As Integer
Get
Return NumberOne * NumberTwo
End Get
End Property
End Class
Editörün görünmesini örnekleyeceğim sınıf MyCustomClass sınıfıdır. Bu sınıfın kendine has bir editör ile property grid üzerinden düzenlenebilmesi için bu sınıfa EditorAttribute tanımlamasını yapmamız gerekiyor. Örnek tanımlama:
<Editor(GetType(MyCustomEditor), GetType(System.Drawing.Design.UITypeEditor))> _
Tanımlamayı yapmak için UITypeEditor sınıfından kalıtılmış bir sınıfı belirtmemiz gerekiyor. Örnek sınıf ve sınfı içerisinde kullanılan UserKontrol'ün kaynak kodları:
Public Class MyCustomEditor
Inherits UITypeEditor
Dim editorService As IWindowsFormsEditorService
Public Overrides Function GetEditStyle(context As System.ComponentModel.ITypeDescriptorContext) As System.Drawing.Design.UITypeEditorEditStyle
Return UITypeEditorEditStyle.DropDown
End Function
Public Overrides Function EditValue(context As System.ComponentModel.ITypeDescriptorContext, provider As System.IServiceProvider, value As Object) As Object
If (provider IsNot Nothing) Then
editorService = CType(provider.GetService(GetType(IWindowsFormsEditorService)), IWindowsFormsEditorService)
End If
If (editorService IsNot Nothing) Then
Dim customClass = CType(value, MyCustomClass)
Dim selectionControl As New MySelectionControl(customClass, editorService)
editorService.DropDownControl(selectionControl)
value = customClass
End If
Return value
End Function
End Class
UserKontrol'e ait kaynak kodları:
Imports System.Windows.Forms.Design
Public Class MySelectionControl
Private _editorService As IWindowsFormsEditorService
Private _value As MyCustomClass
Sub New(value As MyCustomClass, editorService As IWindowsFormsEditorService)
InitializeComponent()
_value = value
_editorService = editorService
FillValue()
End Sub
Private Sub FillValue()
txtNumberOne.Text = _value.NumberOne.ToString()
txtNumberTwo.Text = _value.NumberTwo.ToString()
End Sub
Private Sub SetValue()
_value.NumberOne = Convert.ToInt32(txtNumberOne.Text) + 10
_value.NumberTwo = Convert.ToInt32(txtNumberOne.Text) - 10
_editorService.CloseDropDown()
End Sub
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs)
End Sub
Protected Overrides Sub OnLeave(e As System.EventArgs)
MyBase.OnLeave(e)
SetValue()
End Sub
End Class
Property grid üzerinden çalışmamızın sonuçlarını görelim:

Faydalı olması dileğiyle, iyi çalışmalar.
a2bd6d60-33f8-43f7-b5ef-98c647aabbfc|2|5.0
Merhabalar, daha önce de bu konuya benzer şeyler yazmıştım. Bu yazıda cache işlemlerini kolayca yapabilmek için kullandığım aşağıdaki sınıfı paylaşıyorum. CacheHelper.cs sınıfı aşağıdaki gibidir.
namespace OMR.Core.Helpers
{
using System;
using System.Web;
public class CacheHelper
{
private static HttpContext GetHttpContext()
{
HttpContext httpContext = HttpContext.Current;
if (httpContext == null)
throw new InvalidOperationException();
return httpContext;
}
/// <summary>
/// Önbelleğe nesne eklemek için kullanılır
/// </summary>
/// <typeparam name="T">Nesne tipi</typeparam>
/// <param name="t">Nesne tipi</param>
/// <param name="key">Önbellek anahtarı</param>
/// <param name="minute">Önbellekte kalma süresi</param>
public static void Add<T>(T t, string key, int minute) where T : class
{
GetHttpContext().Cache.Insert(key, t, null, DateTime.Now.AddMinutes(minute), System.Web.Caching.Cache.NoSlidingExpiration);
}
/// <summary>
/// Önbellek anahtarına göre nesneyi önbellekten siler
/// </summary>
/// <param name="key">Önbellek anahtarı</param>
public static void Clear(string key)
{
GetHttpContext().Cache.Remove(key);
}
/// <summary>
/// Önbellekte önbellek anahtarı var mı?
/// </summary>
/// <param name="key">Önbellek anahtarı</param>
/// <returns></returns>
public static bool Exists(string key)
{
return GetHttpContext().Cache[key] != null;
}
/// <summary>
/// Önbellek anahtarına göre ilgili nesneyi dönderir
/// </summary>
/// <typeparam name="T">Nesne tipi</typeparam>
/// <param name="key">Önbellek anahtarı</param>
/// <param name="value">Önbellek değeri</param>
/// <returns></returns>
public static bool Get<T>(string key, out T value) where T : class
{
try
{
// Önbellek anahtarı yok mu?
if (!Exists(key))
{
// Varsayılan değeri ata
value = default(T);
return false;
}
// Önbellekteki değeri ata
value = (T)GetHttpContext().Cache[key];
return true;
}
catch
{
// Hata olması durumunda varsayılan değeri ata
value = default(T);
return false;
}
}
}
}
Faydalı olması dileğiyle, mutlu kodlar.
61ec3cb7-83d1-4a41-aeb1-da8d2447f432|0|.0