Mendapatkan Enumerasi Member Dari Description Attribute

Sebelumnya saya pernah menulis tentang mendapatkan string deskripsi dari enumerasi (baca disini).
Kali ini saya menulis bagaimana melakukan kebalikannya, Mendapatkan enumerasi member berdasarkan string deskripsi.

Misal kita punya enumerasi semacam ini

public Enum JenisHewan
{
   [Description("Cow")]
   Sapi,

   [Description("Cat")]
   Kucing,

   [Description("Dog")]
   Anjing
}

Dari enum tersebut, misal kita mendapat input “cow”, “Cat” atau “Dog”, nah bagaimana kita mendapatkan value Sapi, Kucing atau anjing dari input tersebut?

static JenisHewan MapperStringToEnumHelper(string str)
{
    var tipe = typeof(JenisHewan);
    int returnValue = 0;

    foreach (FieldInfo fi in tipe.GetFields())
    {
        DescriptionAttribute attibute = (DescriptionAttribute)Attribute.GetCustomAttribute(fi, typeof(DescriptionAttribute));

        if (attibute != null)
        {
            if (attibute.Description == str)
            {
                returnValue = (int)fi.GetValue(null);
                break;
            }
        }
    }

    return (JenisHewan)returnValue;
}

Sekarang bagaimana mendapat enumerasi dari string, misal mendapatkan enum ‘Sapi’ dari string “Sapi” atau mendapatkan enum ‘Kucing’ dari string “Kucing”?

static JenisHewan MapperStringToEnumHelper(string str)
{
     var tipe = typeof(JenisHewan);
     int returnValue = 0;
     System.Reflection.FieldInfo fi = tipe.GetField(str);
     returnValue = (int)fi.GetValue(null);

     return (JenisHewan)returnValue;
}

Semoga tips singkat bisa berguna.
Happy coding

Iklan

Threading Menggunakan Delegates

Threading satu cara menjalankan beberapa bagian program secara pararel. Tujuannya adalah agar aplikasi bisa lebih responsif.
Sebagai contoh:

Public Class AdmPropinsi
     ....
     Public Delegate Function GetDataDelegate() As System.Data.DataSet
	
     Public Function GetData() As System.Data.DataSet
     Dim ds As New DataSet
     Try
          Using conn
               If conn.State = ConnectionState.Closed Then conn.Open()
               Using cmd
                    cmd.Connection = conn
                    cmd.CommandText = "Q_Select_Propinsi"
                    cmd.CommandType = CommandType.StoredProcedure

                    da = New OleDbDataAdapter()
                    da.SelectCommand = cmd
                    da.TableMappings.Add("TBR_PROV", "pro")
                    da.Fill(ds, "pro")
                End Using
            End Using
        Catch ex As OleDb.OleDbException
            Throw Exception
	End Try
        Return ds
    End Function
End Class

Di Class diatas ada method GetData() yang akan mengambil informasi dari database dan disimpan ke dataset. Selain method juga didefinisikan delegate function yang juga bertipe sama, DataSet (Baris 3).
Untuk memanggil method diatas dan diproses secara paralel di thread yang lain,
Read the rest of this entry

Format Tanggal di Dalam GridView

Jika ingin menampilkan data tanggal (datetime) di dalam gridview dengan format tertentu, kita perlu set property “DataFormatString” di colom BoundField menjadi

DataFormatString=”{0:?}”. Dimana tanda ? adalah karakter kode format.

contoh:

<asp:GridView ID="GridView1" runat="server" Width="100%" >
    <Columns>
	<asp:BoundField HeaderText="Tanggal" DataField="Tgl" DataFormatString="{0:D}" />
    </Columns>
</asp:GridView>

Berikut Daftar karakter yang digunakan untuk format tanggal di gridview.
Read the rest of this entry

Menampilkan UserControl (.ascx) Secara Dinamis

Usercontrol (.ascx) paling umum digunakan untuk menampilkan header dan footer. Bagaimana menampilkan usercontrol yang berbeda-beda di suatu halaman sesuai kondisi tertentu. Misalnya ketika user A login, maka usercontrol A yang di load, user lainnya menggunakan usercontrol B.

1. Tambahkan reference di halaman page (.aspx) di bagian page directive.

<%@ Reference Control="~/WebUserControlA.ascx" %>
<%@ Reference Control="~/WebUserControlB.ascx" %>

2. Tambahkan control placeholder di halaman page. Placeholder ini digunakan sebagai lokasi dimana usercontrol yang di load akan diletakkan.

<asp:PlaceHolder ID="placeholder1" runat="server"></asp:PlaceHolder>

3.Di code, tambahkan kode di bagian Page_Init. Misal userlogin adalah userA, maka webusercontrolA yang diload.

Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
    If Session("USERLOGIN").ToString() = "userA" Then
        Dim head As WebUserControlA = DirectCast(Page.LoadControl("~/WebUserControlA.ascx"), WebUserControlA)
        placeholder1.Controls.Add(head)
    Else
        Dim head As WebUserControlB = DirectCast(Page.LoadControl("~/WebUserControlB.ascx"), WebUserControlB)
        placeholder1.Controls.Add(head)
    End If
End Sub

Usercontrol akan di load di placeholder. Semoga bermanfaat.

Optimalisasi Performance ASP.net

MENYIMPAN INFORMASI VIEWSTATE DI SERVER

Dalam aplikasi web terdapat banyak faktor yang mempengaruhi performance. Salah satu yang menjadi ‘kekurangan’ ASP.net adalah Viewstate. Viewstate ini berisi informasi-informasi dari semua control yang ada di page. Informasi control ini sebenarnya diproses di server dan kemudian di simpan di viewstate dan ditempelkan ke page dan dikirim ke client. Dan tentu saja, semakin besar informasi viewstate ini, semakin besar pula ukuran file yang di transfer ke client. Untuk melihat informasi viewstate, buka halaman .aspx dan lihat kode sumbernya (view source)

Setiap control di halaman selalu memiliki viewstate padahal tidak semua digunakan. Jika ketika proses postback kita tidak memerlukan informasi dari suatu control maka kita tidak perlu menyimpan viewstate. Kita bisa mematikan viewstate suatu control dengan set ‘EnableViewState=false’ di property control. Tentunya kita harus jeli, menentukan control mana yang memerlukan viewstate dan mana yang tidak.

Selain setting diatas, kita juga bisa memindahkan informasi viewstate ini ke server, jadi tidak akan diikutsertakan dalam page yang dikirim ke client. Untuk menyimpan informasi viewstate di server, kita perlu meng override method ‘SavePageStateToPersistenceMedium’ dan method ‘LoadPageStateFromPersistenceMedium’

Read the rest of this entry

MapXtreme: Too Many Constants in Subexpressions (Maximum is 255)

Beberapa waktu lalu, Mas Ndereklangkung mengalami error ini ketika membuat aplikasi mapxtreme. Dia mencoba melakukan query untuk mencari objek peta. Parameter yang digunakan diambil dari database, diubah jadi string dan dimasukkan dalam query mapinfo
“Select * from Jabodetabek_Sales_Customers where acc_id in (” & xx & “)”
Namun malah muncul error “Unable to parse statement: Select * from Jabodetabek_Sales_Customers where acc_id in (‘5300027541′,’5300058807′,’5300062475′,’…’). Too Many Constants in Subexpressions (Maximum is 255). Ternyata query ‘IN’ di mapinfo hanya mampu menerima 255 parameter. Lebih dari itu akan muncul error

Salah satu cara mengatasi ini adalah memecah queri menjadi beberapa bagian. String parameter yang akan digunakan dalam query, (di contoh ini diambil dari database), kita simpan dalam StringCollection untuk memudahkan mengetahui jumlah parameter dan memisahkannya. xx adalah variabel stringCollection yang akan digunakan.
Read the rest of this entry

MapXtreme: Membuat LayerControl Ver.2.0

Sebelumnya, saya telah menulis bagaimana membuat layercontrol di MXT. Versi 2 ini merupakan versi revisi dari versi 1 yang pernah saya tulis sebelumnya. Saya banyak mengalami kesulitan ketika menerapkan v.1. Karena itu saya memutuskan untuk melakukan perubahan kodenya. Apa yang saya catat disini, hanya bagian yang di ubah. Untuk membuat layercontrol secara lengkap, silahkan baca tulisan sebelumnya.

Kesulitan dari LayerControl v.1

  • Daftar layer tergantung pada data yang disiapkan di database. Baca Bagian 1. Sehingga ketika ada layer peta yang ditambahkan di Workspace manager, layer baru ini tidak secara otomatis ditambahkan ke LayerControl.
  • Di client (javascript), proses dari MapControl ke LayerControl (Baca Bagian 3), checkbox yang ada di layercontrol didefinisikan satu persatu, kita perlu tahu ClientID dari masing-masing checkbox. Jika layer peta ditambahkan di workspace manager, susunan layer akan berubah dan ini berarti harus merubah kode javascript secara manual.

Berdasarkan 2 hal di atas, saya membuat perubahan

  • Daftar layer tidak mengacu pada database yang telah disiapkan sebelumnya, tetapi langsung mengacu pada file MWS. Sehingga, jika ada layer baru ditambahkan di workspace manager, secara otomatis layer baru tersebut akan masuk di layercontrol.
  • Kode javascript untuk proses dari mapcontrol ke layercontrol tidak lagi secara manual. Kita tidak perlu tahu ClientID dari masing-masing checkbox, Javascript akan melakukan looping ke tiap baris di layercontrol dan akan menandai chekbox yang sesuai sesuai kondisi layer yang ada.

Read the rest of this entry