Memakai Type Converter Di User Control C#


Komponen UI di .NET biasanya bersifat user-friendly dan mudah dipakai. Platform .NET bahkan menyertakan fasilitas untuk memprogram perilaku user control pada saat design time. Salah satu contohnya adalah fasilitas type converter yang akan saya pakai pada artikel ini. Pada artikel sebelumnya (Membuat User Control Untuk Windows Form Di C#), saya membuat sebuah user control bernama SimpleObjectEditor yang memiliki sebuah property bernama DomainObject. Saya tidak dapat mengisi nilai property tersebut melalui Properties window di Visual Studio karena nilai yang diberikan harus berupa sebuah objek. Dengan demikian, pengguna harus menjalankan program agar memperoleh visualisasi dari user control ini. Catatan: pengguna user control adalah programmer lain yang memakai user control tersebut bukan pengguna aplikasi yang dihasilkan.

Salah satu solusi agar pengguna dapat mengisi property DomainObject saat merancang form adalah dengan membuat sebuah type converter yang dapat menerjemahkan string berupa nama class menjadi instance dari class tersebut. Untuk itu saya perlu membuat sebuah class baru yang diturunkan dari TypeConverter. Caranya adalah dengan men-klik kanan nama proyek SimpleObjectEditor, memilih menu Add, Class… dan mengisi nama class dengan DomainObjectConverter. Saya kemudian membuat kode program seperti berikut ini:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Reflection;

namespace SimpleObjectEditor
{
    class DomainObjectConverter : TypeConverter
    {        
        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
        {
            if (sourceType == typeof(string))
            {
                return true;
            }
            return base.CanConvertFrom(context, sourceType);
        }

        public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
        {
            if (value is string)
            {
                ConstructorInfo c = Type.GetType(value as string).GetConstructor(Type.EmptyTypes);
                return c.Invoke(new object[]{});
            }
            return base.ConvertFrom(context, culture, value);
        }

        public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
        {
            if (destinationType == typeof(string))
            {
                return value.GetType().FullName;
            }
            return base.ConvertTo(context, culture, value, destinationType);
        }

    }
}

Pada TypeConverter di atas, saya akan membuat instance baru berdasarkan nama class yang diberikan. Programmer harus mengetikkan nama class yang lengkap beserta dengan namespace. Selain itu, domain object yang dipakai juga minimal harus memiliki default constructor (sebuah constructor tanpa parameter).

Langkah berikutnya, saya perlu memberitahu user control agar memakai TypeConverter yang barusan saya buat dengan menggunakan attribute. Pada Java, attribute sangat mirip seperti annotations. Bedanya, di C#, sebuah attribute diawali dan ditutup dengan kurung siku, seperti ([...]). Sebagai contoh, attribute [Obsolete] di C# mirip seperti @Deprecated di Java. Agar user control SimpleObjectEditor memakai TypeConverter di atas, saya perlu menggunakan attribute TypeConverter seperti yang terlihat seperti berikut ini:

public partial class SimpleObjectEditor : UserControl
{
   ...

   [TypeConverter(typeof(DomainObjectConverter))]
   [ParenthesizePropertyName(true)]
   [Description("Domain object yang akan terhubung dengan view editor ini")]                
   public INotifyPropertyChanged DomainObject
   {
      get { return domainObject; }

      set
      {
         domainObject = value;
         UpdateComponents();
      }
   }

   ...
}

Selain itu, saya boleh menghapus variabel designMode. Saya perlu memperbaharui method UpdateComponents() sehingga perilaku SimpleObjectEditor tidak perlu berbeda lagi saat design time dan run time:

public void UpdateComponents()
{
    Controls.Clear();

    if (DomainObject == null) return;

    CreateComponentsForDomainObject();

    DomainObject.PropertyChanged += (o, p) =>
    {
        foreach (TextBox txt in Controls.Find("input" + p.PropertyName, true))
        {
            txt.Text = DomainObject.GetType().GetProperty(p.PropertyName).GetValue(DomainObject, null).ToString();
        }

    };

}

Sekarang, bila saya melihat property milik SimpleObjectEditor di window Properties, saya akan menemukan hasil seperti pada gambar berikut ini:

Tampilan di window Property

Tampilan di window Property

Penggunaan attribute [ParenthesizePropertyName(true)] menyebabkan property DomainObject memiliki tanda kurung dan ditampilkan pada baris awal. Ini sangat berguna untuk menandakan bahwa property tersebut adalah sebuah property penting. Selain itu, penggunaan attribute [Description] akan memperlihatkan teks deskripsi di bagian bahwa window Properties.

Sekarang, saya dapat mengetik dan mengisi property DomainObject dengan nilai SimpleObjectEditorTest.Mahasiswa seperti yang terlihat pada gambar berikut ini:

Mengisi property saat design time

Mengisi property saat design time

Perhatikan bahwa kini tampilan SimpleObjectEditor akan langsung diperbaharui sesuai dengan nilai yang barusan saya berikan sebelumnya.

Bila saya mengubah property DomainObject dengan nilai lain, misalnya SimpleObjectEditorTest.ItemPenjualan, saya akan memperoleh tampilan SimpleObjectEditor yang berbeda seperti yang terlihat pada gambar berikut ini:

Mengisi property saat design time

Mengisi property saat design time

Kesimpulannya: Dukungan design time tidak tersedia di platform Java, melainkan dibuat oleh masing-masing IDE seperti NetBeans atau IntelliJ IDEA! .NET memiliki sifat sebaliknya. Dukungan design time bukan bagian dari Visual Studio, melainkan bagian dari .NET. Tujuannya adalah agar IDE lain juga dapat memanfaatkan dukungan design time yang ada secara seragam. Walaupun demikian, boleh dibilang Visual Studio merupakan satu-satunya IDE yang paling sering dipakai oleh programmer .NET.

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: