Serialize & Deserialize

Fazla açıklamaya gerek yok. Aşağıdaki metotları kullanarak nesnelerinizin Serialize ve Deserialize işlemlerini kolayca yapabilirsiniz..

C#
private string SerializeObject(Type type, object o)
{

    string result = string.Empty;

    System.IO.StringWriter writer = new System.IO.StringWriter();

    System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(type);
    serializer.Serialize(writer, o);

    result = writer.ToString();

    return result;

}

private object DeserializeObject(Type t, string s)
{

    object result = null;

    if (!string.IsNullOrEmpty(s)) {
        System.IO.TextReader tr = new System.IO.StringReader(s);
        System.Xml.XmlReader reader = System.Xml.XmlReader.Create(tr);
        System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(t);

        if (serializer.CanDeserialize(reader)) {
            result = serializer.Deserialize(reader);
        }
    }

    return result;

}

Şöyle biraz daha bu yapıyı geliştirerek kendime bir Class oluşturayım derseniz.. Bir de bunu generic tip ile süslersem ne olur acaba !? dediğinizde ise şu oluyor; 🙂

C#
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
public class c_Serializer<t>
{

    /// <summary>
    /// Parametre olarak ge?ilen nesneye XML serile?tirme uygular..
    /// </summary>
    /// <param name="obj">Serile?tirmek istenilen nesne.
    /// <returns>XML ifade.</returns>
    /// <remarks></remarks>
    public string Serialize(T obj) {

        string result = string.Empty;

        System.IO.StringWriter writer = new System.IO.StringWriter();

        System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(T));
        serializer.Serialize(writer, obj);

        result = writer.ToString();

        return result;

    }

    /// <summary>
    /// Parametre olarak ge?ilen nesneye XML serile?tirme uygular..
    /// </summary>
    /// <param name="type">Serile?tirme uygulanacak tip.
    /// <param name="o">Serile?tirmek istenilen nesne.
    /// <returns>XML ifade.</returns>
    /// <remarks></remarks>
    private string Serialize(Type type, object o) {

        string result = string.Empty;

        System.IO.StringWriter writer = new System.IO.StringWriter();

        System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(type);
        serializer.Serialize(writer, o);

        result = writer.ToString();

        return result;

    }

    /// <summary>
    /// Parametre olarak ge?ilen XML ifadeyi, e?er de-serile?tirme yap?labiliyorsa nesneye ?evirir. Aksi halde "Nothing" d?ner.
    /// </summary>
    /// <param name="s">XML ifade.
    /// <returns>Nesne.</returns>
    /// <remarks></remarks>
    public T Deserialize(string s) {

        T result = null;

        if (!string.IsNullOrEmpty(s)) {
            System.IO.TextReader tr = new System.IO.StringReader(s);
            System.Xml.XmlReader reader = System.Xml.XmlReader.Create(tr);
            System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(T));

            try {
                if (serializer.CanDeserialize(reader)) {
                    result = (T)serializer.Deserialize(reader);
                }

            }
            catch (Exception ex) {
            }

        }

        return result;

    }

    /// <summary>
    /// Parametre olarak ge?ilen XML ifadeyi, e?er de-serile?tirme yap?labiliyorsa nesneye ?evirir. Aksi halde "Nothing" d?ner.
    /// </summary>
    /// <param name="t">De-serile?tirmede kullan?lacak tip.
    /// <param name="s">XML ifade.
    /// <returns>Nesne.</returns>
    /// <remarks></remarks>
    private object Deserialize(Type t, string s) {

        object result = null;

        if (!string.IsNullOrEmpty(s)) {
            System.IO.TextReader tr = new System.IO.StringReader(s);
            System.Xml.XmlReader reader = System.Xml.XmlReader.Create(tr);
            System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(t);

            if (serializer.CanDeserialize(reader)) {
                result = serializer.Deserialize(reader);
            }
        }

        return result;

    }

}

Reklamlar

Visual Studio LightSwitch – Create Advanced Screens

Daha önce geliştirdiğimiz ilk LightSwitch uygulamamıza kaldığımız yerden devam ediyoruz. Önceki makalemizde(Visual Studio Lightswitch – Create Editable Grid Screens Using Chinook Database) LightSwitch’e giriş yaptık. Ekranları ve menülerden bahsettik. CodePlex’ten indirdiğimiz Chinook veri tabanını bağlayarak kullandık. Üç adet ekran hazırladık. Bu ekranların kullanımını inceledik. Bize sunduğu avantajlardan yararlanarak neler elde edebileceğimizi gördük.

Öncelikle şunu belirtmek istiyorum Visual Studio LightSwitch şuan Beta 1 aşamasında bu sebeple ileride Release olduğunda doğabilecek değişikliklerde uygulamalarınızda bazı sorunlar çıkabilir. Şu aşamada eğer basit işler için kullanırsanız daha sağlıklı olacağını düşünüyorum.

Bu uyarıdan sonra bu makalemizdeki amacımıza konuyu getirmek istiyorum. Yukarıdaki link’ten erişebileceğiniz makalemize kaldığımız yerden devam ediyoruz. Chinook veri tabanının üç tablosunu kullanarak(Artist, Album, Track) oluşturduğumuz üç ekranı(Screen: Artistler, Albümler, Şarkılar) tek bir ekranda nasıl oluşturabileceğimizi ve yerleşimlerini ayarlayabileceğimizi inceliyor olacağız. Aslında bir nevi gelişmiş bir ekran oluşturacağız.

En son projemizin durumu ve görünümü şu şekildeydi.

img1

Uygulamayı çalıştırdığımızda şu ekranları görebiliyorduk.

img2

img3

img4

Burada yeni bir ekran oluşturarak bu üç ekranı tek bir ekranda toplayalım. Bunun için VisualStudio ‘da design görünümüne geri dönüyorum ve “Screen” ekle düğmesi ile yeni bir ekran oluşturma sihirbazını çalıştırıyorum.

img5

Editable Grid Screen” şablonunu seçiyorum ve sağ taraftaki “Screen Data” kısmından “Artist” tablosunu seçiyoruz.

img6

Karşımıza “Artistler” ekranını yaparken gelen ekranın aynısı geliyor(Önceki makale de). Burada ekran üzerindeki kontrollerin “Document Outline” olarak gösterimi bulunmaktadır. Önceki makalemizde bu kısımlara dokunmadan ekranlarımızı oluşturmuştuk. Bu sefer artık işin detayına giriyoruz..

img7

Sol tarafta “ArtistCollection” ile belirtildiği üzere ekran üzerinde “Artist” tablosundan gelen verilerin “Artist” nesnesi olarak nesneleştirilmesi ve “ArtistCollection” olarak koleksiyon haline getirilip Data Grid üzerinde gösterileceği anlaşılmaktadır. Hemen altında “Selected Item” , yani seçilen (Artist nesnesinin) özellikleri görünmektedir. Bu özellikler Artist tablosundaki kolonlara karşılık gelmektedir.

img8

Selected Item” özelliklerinde en altta “Albums” özelliğini ekleyebileceğiniz bir link bulunmaktadır. Bu link gri renkte soluk olarak görünmektedir(“+ Add Albums” ) Bu link’in orada olmasının sebebi “Artist” tablosunun “Album” tablosu ile ilişkili olmasından dolayı orada görünmesidir. Bu link’e tıklayarak “selected Item” nesnesinin Album koleksiyonunu ‘da yüklemesi sağlanıyor.

img9

Böylece Artist’e ait olan Albümlerin koleksiyonunu “Selected Items” nesnesi içinde özellik olarak bağlamış olduk. Seçili Album nesnesinin özellikleri de “AlbumsCollection” altındaki “Selected Item” altında özelliklerde görünmektedir. Aynı şekilde AlbumsCollection bölümü altında “+ Add Tracks” link’ine tıklayarak Albüm’e ait şarkıların koleksiyonunun nesneye bağlanmasını sağlayalım. Bu link, Album tablosunun Track tablosu ile ilişkili olmasından dolayı görünmektedir.

img10

TracksCollection” altındaki nesnelerin özelliklerini de görebiliyorsunuz. Böylece Artist nesnemizin Album ve Track koleksiyonlarını bağlamış olduk. Design ekranında sağ tarafta kontrol hiyerarşisi üzerinde bu bağladığımız ekranları yerleştirmek için gerekli ayarları yapmaya başlayabiliriz. Ben bu işlemi uygulama çalışırken yapmayı tercih ediyorum. Çünkü böylece görsel olarak ön izleme mevcut olduğundan daha kolay ve ne yaptığınızı görerek ekranları oluşturabiliyorsunuz. “Save” ederek uygulamayı çalıştırıyorum(“F5”).

ArtistDetayları” ekranına geçiyorum. Bu ekranın “Artistler” ekranından farklı olmadığını görüyorsunuz. Bu ekran ‘ın sağ üst köşesindeki “Customize Screen” düğmesi ile bu ekranı özelleştirebileceğim ekrana geçiyorum.

img11

Bizi aşağıdaki ekran karşılıyor. Bu ekranı kısaca açıklamak gerekirse, Sol tarafta Visual Studio içindeki Design ekranını aynısını görüyorsunuz(Kontrol hiyerarşisi bulunuyor-DocumentOutline). En sol tarafta ise “olay” , “grup paneli” , “kontrol silme” , “yukarı-aşağı yerini değiştirme” , “içerdiği alanları resetleme” gibi işlemleri yapabileceğiniz bir menü bulunmaktadır. Sağ tarafta altta yine visual studio ‘da design ekranında iken sağ tarafta bulunan “properties” sekmesinin aynısı görünmektedir. Bu görünümün üstünde ise ön izleme ekranı bulunmaktadır. En yukarıda ise yaptığımız değişiklikleri kaydedeceğimiz ya da iptal ederek özelleştirme ekranından çıkabilmemizi sağlayacak olan düğmeler bulunmaktadır.

img12

Öncelikle yapacağımız görünümü bir gözümüzde canlandıralım. Artist listesi ekranımızda amacımız bu listenin hemen altında iki kolonlu bir tablo gibi sol tarafta albümlerin listelenmesini sağlamak ve bu albümlerin listesinin sağında da seçilen albüme ait şarkıların listelenmesini sağlamak istiyorum.

Bunun için “Add” düğmesinden “New Group” ‘u seçiyorum.

 img13

Bana bir adet “Vertical Stack” getiriyor. Fakat bu bizim istediğimiz değil. Bize “Horizontal Stack” yada “Two Column” gibi bir şey lazım. Hemen yeni eklediğim “Vertical Stack” kontrolünün üzerine geliyorum ve tıklayarak listenin açılmasını sağlıyorum. Açılan listeyi incelerseniz birçok alternatif seçeneğimiz olduğunu görebilirsiniz. (Biliyorum hayal gücünüz bir anda atağa geçti.) Buradan “Horizontal Stack” seçiyoruz.

 img14

Ardından “Horizontal Stack” altındaki “Add” düğmesini kullanarak “AlbumsCollection” ‘ı bu Horizontal Stack içine ekliyoruz.

 img15

Ön izleme kısmında albümlerimizin nasıl geldiğine dikkat edin. Ardından “Add” düğmesi ise “TracksColleciton” ‘ı ekliyoruz.

 img16

Oluşan ekranımızı ön izleme kısmından takip ediyoruz.

 img17

İstediğimiz oldu gibi ama ön izlemede görüyoruz ki pek istediğimiz gibi olmadı. Son eklediğimiz “TrackCollection” neden kalan alana tam olarak yayılmadı? Şimdi bu sorunu çözelim. LightSwicth ile çoğu şey düşünülmüş, ekranları ince ayarına kadar tasarlayabiliyorsunuz. Eklediğimiz “Horizontal Stack” ‘ın bu iş için uygun olmadığını düşünüyoruz ve Horizontal Stack üzerine gelip, listeyi açarak “Two Columns” seçiyoruz.

 img18

Tabii yaptığımız eklemeler gidiyor. “Left Column” ve “Right Columns” seçeneklerinin yanındaki “Choose Content” yazısının üzerine geldiğiniz de düğme görünümü almaktadır. “Choose Content” ‘ den “Left Column” için “AlbumsCollection” ’ı , “Right Column” için “TracksCollection” ‘ı seçiyoruz.

 

img19

 img20

Ön izlemeden uygulamamızın son haline bakıyoruz. İstediğimiz görüntünün oluştuğunu görüyoruz.

 img21

Bizi neden uğraştırıyorsun baştan yaptırsana böyle demeyin. Böylece Horizontal Stack’in sadece seçilen koleksiyonların oluşturduğu kontrolleri yan yana belli bir genişlikte sıraladığını öğrenmiş olduk. Şimdi sağ üst köşedeki “Save” düğmesi ile yaptığımız değişiklikleri kaydederek uygulamamıza bakıyoruz.

 img22

Böylece amacımıza ulaşmış olduk. Denediğinizde, seçilen artist’e ait albümler listelendiği gibi seçilen artist’e ait albümlerinden seçine albüm’e ait şarkılar listelenmektedir.

NOT : Uygulama çalışırken yaptığımız “Customize Screen” işlemi sonucu elde ettiğimiz ekran ayarları otomatik olarak Visual Studio içinde de geçerli olur.

 img23

Şunu belirtmek istiyorum. Her listedeki yeni kayıt ekleme, düzenleme, silme, excel’e aktarma, arama yapma işlemleri çalışmaktadır. Süper di mi !

Gelelim basit düzenlemelere.. Evettt işimiz daha bitmedi. Çalışan uygulamamıza geri dönüyoruz ve tekrar “Customize Screen” düğmesi ile özelleştirme ekranına geri dönüyoruz.

Sol taraftaki kontrol listesinde “ArtistCollection” yanındaki “DataGrid” üzerine gelip tıkladığımız da açılan menüden “List” seçiyoruz. Böylece öz izleme de Artist’lerin listesi kısmında, kullanıcı için gereksiz olan “ArtistId” kolonu ekrandan kaldırılıyor. Kontrol olarak da DataGrid, Listbox’a dönüştürülüyor.

 img24

NOT : Ön izleme ekranında bile uygulama kullanılabiliyor.

 

Ardından “ArtistCollection” ‘ın List’i seçili iken “properties” ekranından “Display Name” ve açıklamayı değiştiriyorum. Gördüğünüz gibi burada başka özelliklerde mevcuttur.

img25

Albüm ve şarkı tablolarını liste yapmıyorum. Çünkü liste yaparsam, bir albüm’ün artist’ini değiştirerek güncelleyemem. İsterseniz deneyerek görebilirsiniz. Sırası ile “AlbumCollection” ‘ı ve “TracksCollection” ‘ı seçiyorum ve onlarında “Properties” kısmından özelliklerini güncelliyorum.

img26

img27

Gördüğünüz gibi çok hoş oynuyoruz. Şimdi gelelim biraz daha derine inmeye, Album listesinde ön izlemeden görebiliyoruz ki kullanıcının işine yaramayacak “AlbumId ” kolonu mevcut. Bu kolonun kullanıcıya görünmemesini istiyoruz. Bunun için kontrol listesinden Albüm’ü listeleyen kontrolün(TwoColumn -> Left Column) altında “DataGridRow” node’ını açıyoruz ve “AlbumId” ‘yi gösteren Label’ı seçiyoruz. Gördüğünüz gibi bu kontrolleri bile değiştirebiliyoruz. Label’ı seçip “Properties” kısmından “IsVisible” işaretini kaldırıyorum.

img28

Ön izlemeye baktığımızda kolonun hala durduğunu görüyoruz. Fakat değerleri artık görünmüyor. Buradan anlıyoruz ki bu özellik bize sadece kolonun içindeki Label’ı görünmez yapıyor. Kolonu görünmez yapmıyor. Eğer kolonun bile görünmemesini istiyorsak, Kontrol hiyerarşisinin solundaki menü’den “X” düğmesine basarak Label’ı içeren node’ı hiyerarşiden kaldırmalıyız.

img29

Böylece ön izlemede artık görünmediğini görüyoruz. Burada “Title” ve “Artist” ’i içeren kolonları da hiyerarşiden seçerek “Properties” ekranından özelliklerinde değişiklikler yapabiliriz.

img30

Aynı şekilde şarkılar listesindeki “DataGridRow” ‘u da açarak istemediğimiz kolonları kaldırıyoruz. İstediklerimizin özellikleri ile oynuyoruz.

img31

Böylece uygulamamız şu şekilde görünüyor.

img32

Aynen listelerin kolonlarını düzenlediğimiz gibi “DataGridRow” ‘un üzerindeki “Command Bar” kısmından düğmelerin isimleri ile de oynayabiliriz.

img33

Son olarak ufak bir ayar daha yaparak ekran özelleştirme işlemini bitiriyoruz. Ekranımızın son hali aşağıda ve bu görünümde bir ufak değişiklik yapacağız.

img34

Burada göreceğiniz gibi şarkılar listesi ekranın sağ alt köşesinde sıkışmış görünüyor. Halbu ki Albümler o kadar çok içeriğe sahip bir liste değil ve boş alanları var. O zaman albüm alanından biraz şarkı listesine verebiliriz.

Özelleştirme ekranında “TwoColumns” seçiyoruz. “Properties” ekranında “Selection Size” özelliğindeki Track bar’ı sol a doğru ön izlemeden kontrol ederek çekiyoruz.

img35

img37

Böylece artık programımız istediğimiz gibi görünüyor. Kullanıma hazır.

img38

Bir sonraki makalede görüşmek üzere,

Herkese iyi çalışmalar..

Visual Studio Lightswitch – Create Editable Grid Screens Using Chinook Database

Evet sonunda bunuda mı görecektim. Her geçen gün yazılımcıya ihtiyaç azalıyor gibi mi? Acaba? Tabii ki hayır ! 🙂 Bu araçlar yazılımcıların yerini alması için değil, yazılımcıların kullanıcıların ihtiyaçlarına daha hızlı yanıt vermesi ve daha hızlı, daha hatasız çözüm getirmesi için geliştiriliyor. Sonuçta siz tek başınıza yazılım geliştiren bir geliştirici olabilirsiniz. Böyle durumları düşündüğünüzde sizi tasarım yapmaktan, user experience vs gibi kavramlardan kurtaran çözümler olarak yerlerini alıyorlar. Hatta yazılımcıları geliştirici yönlerini de unutmamak gerekiyor. Tüm bunları düşündüğünüzde artıları eksilerinden çok daha fazla oluyor.

img1

Sözü fazla uzatmadan LightSwitch nedir? Ne değildir? Ne sağlıyor ki bize bunları anlatıyorsun bu konulara gelelim. Aslında bu konuları burada uzun uzadıya yazmayacağım. Çünkü zaten yazan arkadaşlar var. Sizi onların sayfasına yönlendirerek oradan giriş yapmanızı isteyeceğim. Sonrasında da yazımıza kaldığınız yerden devam edip LightSwitch ile güzel bir uygulama geliştireceğiz.

Öncelikle LightSwitch ‘in resmi sitesine buradan ulaşabilirsiniz. Videolarını izleyerek gerekli yüklemeleri buradan yapabilirsiniz..

LightSwitch ‘e giriş için Mehmet Sencer Karadayı arkadaşımızın sitesindeki yazıyı öncelikle okumanızı öneririm. Buradan ulaşabilirsiniz.

Şimdi tüm bu işlemler tamam ise, artık LightSwitch hakkında bilinçli, ne olduğunu bilen, vayyy bee adamlar neler yapmış, ne güzel şeylerle uğraşıyorlar, peki ben nasıl bunu kullanabilirim diyorsanız olayımıza başlayabiliriz.

Öncelikle örnek bir veritabanı ihtiyacım olduğundan internetten Chinook Database’ini indirdim. Ufak ve basit bir veritabanı yapısı, içinde verilerde bulunuyor. Ben yapacağım örnek uygulamada bu veritabanını kullanacağım. Buradan indirebilirsiniz..

img2

Veritabanı şemasını da yukarıda görebilirsiniz. Bu veritabanın ‘daki 3 tabloyu kullanarak uygulamamızı geliştireceğiz. Bu tablolar; “Artist” , “Album” , “Track” olacak.

Amacımızı maddeleyerek devam edelim;

· Artist tablosundaki artist’leri listelemek.

· Seçilen artist’e ait albüm’leri listelemek.

· Seçilen albüm’e ait şarkıları(Track) listelemek.

· Bu üç liste(Artist, albüm, şarkı listeleri) üzerinde veri ekleyebilme.

· Bu üç liste(Artist, albüm, şarkı listeleri) üzerinde veri düzenleyebilme.

· Bu üç liste(Artist, albüm, şarkı listeleri) üzerinde veri silebilme.

· Bu üç liste(Artist, albüm, şarkı listeleri) üzerinde arama yapabilme.

· Bu üç liste(Artist, albüm, şarkı listeleri) üzerinde excel export yapabilme.

Bu işlemler yaparsak zaten kocaman, elimizde hazır bir program oluyor. Ben bunu satarım bile diyebilirsiniz. Neden olmasın

Size şunu desem aklınıza ilk ne gelir? Tüm bu saydıklarımı kod yazmadan yapabileceğimiz. Üstelik bu programın hem Windows hem web’de çalışabileceği hatta LightSwitch Release olduktan sonra(şu an Beta 1 aşamasın da) Cloud üzerinde de çalıştırabileceğiz desem. Bir yazılımcı olarak aklınıza “geliştirici olma yönünden” ne gelir? “Süper para kazanırım” diye tabii ki gelir ama onu kastetmiyorum. Bir uygulamayı geliştirirken artık en önemli safhanın neresi olacağını düşünürsünüz? Veritabanı.. Benim aklıma ilk bu geldi. Demek ki artık ne ara yüzü nasıl yapacağımı ne arama işlemini nasıl yapacağımı, ne excel aktarma işlemini nasıl yapacağımı, ne de nasıl hem Windows hem web’de çalışabilir diye düşünmeme gerek yok. Veritabanını çok iyi kurgularsam. Ekranları çok rahat ve çok düzenli bir şekilde oluşturabilir ve kullanıcıların eline temel bir uygulama verebilirim. Bu gerçekten veritabanının önemini bir kere daha ortaya koyuyor. Veritabanını çok iyi kurgulamanın geliştiriciyi ve kullanıcıyı ne kadar memnun ettiğini ve rahatlatabileceğini ortaya koyuyor.

Neyse bu kadar konuşmak yeter. Artık yap şu örneği diyor olabilirsiniz. Hemen geçiyorum.

İndirdiğiniz Chinook veritabanı dosyasını sıkıştırılmış klasöründen çıkardığınızda “SqlServer” klasöründeki “create.bat” isimli dosyayı çalıştırarak SQL Express kullanarak sisteminize ekleyebilirsiniz..

LightSwitch ‘in resmi sitesinden, LightSwitch ‘i indirip kurduysanız. Tüm malzemelerimiz hazır demektir. Yemeğimizi yapmaya başlayabiliriz.

LightSwitch kurulumundan sonra Visual Studio 2010 ‘u açtığımızda aşağıdaki ekranı görebilir hale geleceksiniz.

img3

Sol tarafta “LightSwitch” template’ini seçtiğinizde “VB” ve “C#” ile bir proje açabilirsiniz.. Ben Visual Basic ‘i seçmişim. Siz C#’ da seçebilirsiniz. Çünkü belirttiğim gibi bu yazımızda kod yazmayacağız. Kod yazmadan olayı bitireceğiz. Aşağıdaki ekran bizi karşılayacaktır.

img4

Burada iki seçeneğimiz bulunuyor. “Create New Table” ile yeni bir tablo oluşturmak. Ya da “Attach to external database” ifadesi ile varolan bir veritabanını geliştireceğimiz uygulama için projemize bağlamak. Biz “Attach to external database” seçiyoruz.(Chinook ‘u boşuna mı yükledik)

Adımları takip ediyoruz. Bu arada “LightSwitch” in ne tür veritabanları ile çalışabildiğini de bizzat görebiliyoruz.

img5

img6

img7

Yukarıda, senaryomuzda bahsettiğim gibi 3 tabloyu kullanacağız. (Album, Artist, Track)

img8

“Finish” işleminden sonra projemizde durumlar şu şekilde değişiyor..

img9

Şimdi bizim için neler yapıldığını bir inceleyelim. Solution içerisinde oluşturduğumuz veritabanı bağlantısı için “DataSources” klasörü altına bir “ChinookData” yapısı oluşturuldu. Onun altına da seçtiğimiz tablolar için yapılar oluşturuldu. Yani bukadar mı? 3-4 parça bir şey mi eklendi. Aslında hayır ! Çünkü durum şu şekilde, solution içinde gördüğünüz görünüm, özelleştirilmiş bir görünümdür. Aslında gerçek proje class’larını görmek istiyorsanız.. “Solution Explorer” ekranının üst tarafında en sağ taraftaki dropdown buton ‘dan “File View” seçeneğini seçmelisiniz..

img10

img11

İşte bu görünümde aslında neyle uğraştığınızı daha iyi görebilirsiniz..  Çok güzel dimi !?

Biz devam edelim. Tekrar “Logical View” seçerek görünümü değiştiriyorum. Böylesi daha hoş görünüyor.

Birazda sol taraftaki tasarım alanından bahsedelim. Burada tablolarınızın kolonlarını ve bu kolonların özelliklerini görebilirsiniz. Biz var olan bir veritabanı kullandığımız için otomatik olarak bu tanımlamalar okunuyor ve yapılıyor. Zaten değiştiremiyorsunuz da, çünkü varolan bir veritabanına bağlı olarak çalışıyorsunuz. Eğer ilk ekranda ki kendi tablomuzu oluşturarak devam etseydik buralarla oynayabilirdik.

img12

Bu ekranda bazı konulara değinmek istiyorum. “String” veri tipinde tanımlı kolonlar ile ilgili bazı özel durumlar söz konusu. Yukarıdaki resimde dikkat ettiyseniz kolon tipinde “EmailAddress” , “PhoneNumber” gibi alışık olduğumuz veritabanı tiplerinden farklı formatlar var. Normalde veritabanı tiplerinden başka tipe kolonu atayamıyorsunuz fakat burada görüldüğü gibi bu iki format’ı seçerek verilerin o formatta düzenlenmesini sağlayabiliyorsunuz. Bu da sizi kod yazmadan kurtaran bir yöntem olarak aklımızın bir kenarında duruyor.

Bu ekranda tablolarınızın arasındaki ilişkiler ve bu ilişkilerin sonucu oluşturulmuş bazı “Collection” ‘ları görebiliyorsunuz. Mesela “Album” tablonuz “Artist” ve “Track” ile nasıl ilişkili olduğunu görebildiğiniz gibi aşağıdaki resimde de görebildiğiniz bu tablolarla arasındaki ilişki neticesinde ilgili kolon’larının tiplerinde nesnesel bir tipleme söz konusu. “Many-to-one” olan kolon ilişkilerinde sadece bir nesne olarak tipleme söz konusu iken “One-to-many” olan kolon ilişkilerinde tipe ait bir “Collection” tiplemesi söz konusu.

img13

Şimdi buraya kadar açıklamalarımızı yaptığımıza göre artık, elimizde bir otomatik oluşturulmuş yapı var. Peki ekranlarımızı nasıl hazırlayacağız. Design ekranında bir tabloyu seçtiğimizde “Properties” de bu tablo ile ilgili özellikleri görebiliyoruz.

img14

Burada daha önce oluşturulduysa varsayılan ekranının ne olacağı(ekran konusuna geleceğiz.), Çoğul isminin(Plural Name) ne olacağı, arama yapılabilir olup olmayacağı(Is Searchable), isminin(Name) ne olacağı, açıklama(Description), Görünen isminin(Display Name), bir özet durumu varsa bunun hangi kolon olacağı(Summary Property) gibi özelliklerini ayarlayabiliyoruz. Burada birkaç özellik ile oynayalım.

Display Name : Albüm

Description : Artiste ait albüm listesini içerir.

Şeklinde değiştirdim. Sonra Design ekranında “Artist” tablosuna çift tıklıyorum. Artist tablosu ekranın ortasına geliyor ve burada da diğer tabloda yapabildiğimiz şeyler mümkündür.

img15

Özelliklerini şu şekilde değiştirdim.

img16

Track” tablosunun da özelliklerini şu şekilde değiştiriyorum.

img17

Bu işlemlerden sonra “Artist” tablosuna geliyoruz.

img18

Design ekranında üst tarafında görünen bar’da “Relationship..”, “Computed Property”, “Query”, “Screen…”, “Write Code” … gibi işlemlerle sorgu oluşturma, ilişki oluşturma, ekran oluşturma, kod yazma gibi seçeneklerimiz mevcut. Biz burada “Screen” tıklayarak bu tablo ile ilgili bir ekran oluşturacağız.

img19

Gelen ekranda sol tarafta ekran şablonları mevcuttur. Bu şablonlara tek tek bakarsanız ekranın ortasında nasıl bir görünüm oluşturulacağı da gösterilmektedir. Biz buradan “Editable Grid Screen” şablonunu seçiyoruz(Daha sonra diğer şablonları incelemenizi öneririm). Sağ taraftan Artist tablosunu seçiyorum. “Screen Name” olarak da “Artistler” yazıyorum. OK düğmesine basıyorum.

img20

Öncelikle Solution içindeki “Screens” klasöründe “Artistler” ekranımız otomatik oluşuyor. Sol tarafta ise “Document Outline” formatında bu ekrandaki kontrollerin hiyerarşisini görebilmekteyiz. Öncelikle uygulamamızı “F5” ile bu haliyle çalıştırıyoruz.. Ne oldu bir görelim. Bu arada eğer uygulamanız çalışmazsa ve SQL Express ile ilgili bir hata alırsanız(Bende servisi çalıştırmamışımJ). Uygulamanın SQL Express ‘i bilgisayarınızda kurulu olmasını ve çalışıyor olmasını istediğini belirtmek istiyorum.

img21

Gördüğünüz gibi çok şık bir ekran bizi karşılıyor. Hem de gördüğünüz her şey çalışıyor.  Yani öncelikle sol taraf da ekranımızın listelendiğini görebilirsiniz. Üst tarafta “Save”(kaydet), “Refresh”(Yenile) düğmelerini ve sağ tarafta verilerimizin listelendiğini görebiliyoruz. Çekinmeyin biraz oynayın tıklayın.  Ardından arama yapılabildiğini, Excel ‘e aktarma yapılabildiğini ve listenin hemen üstünde “Add…”(Yeni veri ekleme), “Edit…”(Düzenleme), “Delete”(Silme), “Refresh”(Yenileme) yapabildiğinizi görmek güzel.  Ayrıca Grid üzerinde sayfalama yapılması da harika. Şu anda bu tablo üzerinde yaptığınız her şey çalışacaktır. Şaşırabilirsiniz..  Evet şu an bir ekran hazırladık. Program hazır. Üstelik uygulama penceresinin sağ yukarısında bulunan turuncu düğme ile “Customize Screen” ekrandaki kontrolleri kaldırmanız ya da yerini değiştirmeniz mümkün. Bu değişiklikler otomatik olarak Visual Studio içindeki projemize de yansıyor. Şimdi ekranı kapatıp diğer ekranlarımızı da oluşturalım. Solution Explorer’da “Albums” kaynağına çift tıklıyoruz. Design kısmındaki menü’den “Screen” düğmesine tıklıyoruz.

img22

img23

OK’e basıyorum. Aynı işlemleri “Track” tablosu içinde yapıyoruz..

img24

OK’e basıyoruz. Kaydediyoruz ve uygulamayı tekrar çalıştırıyoruz.

image

Sol taraftaki ekran listenizden tüm ekranları sırası ile çift tıkladığınızda çok şık bir şekilde Tab’lar ile her ekranı açtığını görebilirsiniz. Çok hoş dimi? Şu an tüm tablolarda işlem yapabiliyorsunuz. Enfes… Harika..

image

Hatta dikkatinizi çekmek istediğim bir yer var. Ekranlarda listelenen verilerde ilişkili kolonların üzerine gelindiğinde yukarıdaki ekran görüntüsünde görüldüğü bir Browse(Gözat) düğmesi bize sunuluyor. Buradan aşağıdaki ekran görüntüsündeki gibi bize ilişkili tablonun verileri listeleniyor ve seçilmesine imkan veriyor. Bu da çok harika bir özellik..

image

Yapılan işlemler ile ilgili ekranda bazı görünüm değişikliği söz konusu oluyor. Aşağıdaki ekran görüntüsünde “Edit…”(Düzenleme) yapılan satırların başına yıldız(*) işareti geliyor ve sarı renkte gösteriliyor. “Delete”(Silme) yapılan satırların başına kırmızı bir çarpı işareti geliyor ve sarı renkte gösteriliyor.

img27

Add…”(Yeni) eklenen kayıtlarda ise en alt satırda, satır başında yıldız(*) işareti geliyor ve sarı renkte gösteriliyor. Ayrıca Tab ‘ın sol köşesinde de yıldız(*) işareti gösteriliyor. Aynı zamanda “Save”(Kaydet) butonu da aktifleşiyor. Kaydet düğmesine basmadığınız sürece yapılan işlemler kaydedilmiyor.

img28

Buraya kadar yaptıklarımız ile amacımıza ulaşmış oluyoruz. Makalemizin yukarılarında sıraladığımız amacımıza ulaşmış oluyoruz.

Burada bazı sorularınız ve küçümsemeleriniz olabilir. Bunu mu yani yapıyordu? Ben böyle bir şey zaten geliştirdim? Ne var ki bun da? Diyebilirsiniz. Fakat emin olun bu daha buz dağını görünen kısmıdır. Uygulamayı kapattığınızda Visual Studio ‘nun design ekranında göreceğiniz üzere ekranda gördüğünüz bütün kontrolleri hiyerarşik görünümden değiştirebiliyorsunuz. DataGrid yerine Listbox kullanabiliyorsunuz. Butonları silebiliyor, kolonları kaldırabiliyor. Çok ince detaylar bile yapabiliyorsunuz. Bu gibi işlemlere diğer yazımızda kaldığımız yerden devam edeceğiz.

Hatta daha güzel bir şey yaparak, bu 3 ekranı tek ekranda nasıl toplayacağınızı ve bir artist seçildiğinde nasıl albümlerinin otomatik listeleneceğini, seçilen albümünün nasıl şarkılarının listeleneceğini göstereceğim. Şimdiden güzel bir ödev kokusunda bir amacımız oldu.

Görüşmek üzere,

Herkese iyi çalışmalar..

VB – Yanıp Sönen Etiket (Flashing Label) Kontrolü Oluşturma

Bu yazımızda yanıp sönen ve kullanıcının ilgilini çeken bir etiket(Label) kontrolü geliştireceğiz. Projelerimde çoğu zaman böyle bir ifadeye, kullanıcının mutlaka okuması gereken, dikkat etmesi gereken yazılara ihtiyaç duyarım. Çoğu uygulamada da bu şekilde ifadeler mevcuttur. Yaygın olarak bu ifadeler uygulama içinde “Kalın(Bold)” ve “Altı Çizili(Underline)” olarak ayarlanırlar. Ya da kırmızı olarak renklendirilirler. Fakat yaptığım projelerde karşılaştığım kadarı ile bu belirginleştirme, kullanıcıların farketmesini sağlamıyor. Ya da kullanıcıların alışkanlıklarından ötürü dikkatlerinin oraya çekilmesini sağlamıyor. Bu konuda düşünürken, bu konuda parlak bir fikir aklıma geldi. 🙂 Evettt gerçekten parlak, hatta yanıp sönen :)) Sonunda yanıp sönen bir etiket(Label) kontrolü geliştirmeye karar verdim. Sonunda nasıl birşey mi çıktı. Buyrun aşağıdadır.

kmb-udemy-reklam

HighlightLabel.vb
Public Class HighlightLabel
Inherits Label

#Region “Initialize”

Private components As System.ComponentModel.IContainer
Friend WithEvents tmrRepater As System.Windows.Forms.Timer

Public Sub New()
Me.InitializeComponent()
End Sub

Private Sub InitializeComponent()
Me.components = New System.ComponentModel.Container()
Me.tmrRepater = New System.Windows.Forms.Timer(Me.components)
Me.SuspendLayout()
‘tmrRepater        
Me.tmrRepater.Interval = 5
‘        ‘HighlightLabel      
Me.ResumeLayout(False)

End Sub

#End Region

#Region “Events”

Public Event HighlightSpeedChanged(ByVal value As Integer)

#End Region

#Region “Properties”

Private _HighlightSpeed As Integer = 5
”’ I??kland?rman?n h?z?n? belirler.    
”’ (Minimum : 1 Maksimum : 50)  
”’   
Public Property HighlightSpeed() As Integer
Get
Return _HighlightSpeed
End Get
Set(ByVal value As Integer)

If (value < 1) Then value = 1
If (value > 50) Then value = 50

_HighlightSpeed = value

RaiseEvent HighlightSpeedChanged(value)

End Set
End Property

Private _IsHighlightEnabled As Boolean = True
Public Property IsHighlightEnabled() As Boolean
Get
Return _IsHighlightEnabled
End Get
Set(ByVal value As Boolean)
_IsHighlightEnabled = value

If (Not _IsHighlightEnabled) Then
Me.StopLabelHighlight()
End If

End Set
End Property

#End Region

#Region “Local Variables”

Dim red As Integer = 0
Dim green As Integer = 0
Dim blue As Integer = 0
Dim feeder As Integer = Me.HighlightSpeed

#End Region

#Region “Public Methods”

”’
”’ E?er IsHighlightEnabled = True ise ???kland?rmay? ba?lat?r.  
”’     
Public Sub StartLabelHighlight()

If (Me.IsHighlightEnabled) Then
Me.tmrRepater.Enabled = True
Me.tmrRepater.Start()
End If

End Sub

”’ I??kland?rmay? durdurur.      
Public Sub StopLabelHighlight()

Me.tmrRepater.Enabled = False
Me.tmrRepater.Stop()

End Sub

#End Region

#Region “Event Handlers”

Private Sub tmrRepater_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tmrRepater.Tick

If (red + feeder >= 255) Then
feeder = (-1) * Me.HighlightSpeed
red = 255
ElseIf (red + feeder <= 0) Then
feeder = (1) * Me.HighlightSpeed
red = 0
End If

red += feeder

Me.ForeColor = Color.FromArgb(red, green, blue)
End Sub

#End Region

End Class

image Kontrolü test etmek için gerekli test formu

 

Form3.Designer.vb
Partial Class Form3
Inherits System.Windows.Forms.Form

‘Form overrides dispose to clean up the component list.     
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub

‘Required by the Windows Form Designer    
Private components As System.ComponentModel.IContainer

‘NOTE: The following procedure is required by the Windows Form Designer    ‘It can be modified using the Windows Form Designer.      ‘Do not modify it using the code editor.     _    
Private Sub InitializeComponent()
Me.btnHizlandir = New System.Windows.Forms.Button()
Me.btnYavaslat = New System.Windows.Forms.Button()
Me.Label1 = New System.Windows.Forms.Label()
Me.HighlightLabel1 = New WindowsApplication1.HighlightLabel()
Me.SuspendLayout()

‘btnHizlandir       

Me.btnHizlandir.Location = New System.Drawing.Point(301, 97)
Me.btnHizlandir.Name = “btnHizlandir”
Me.btnHizlandir.Size = New System.Drawing.Size(75, 23)
Me.btnHizlandir.TabIndex = 1
Me.btnHizlandir.Text = “H?zland?r”
Me.btnHizlandir.UseVisualStyleBackColor = True

‘btnYavaslat        ‘        
Me.btnYavaslat.Location = New System.Drawing.Point(220, 97)
Me.btnYavaslat.Name = “btnYavaslat”
Me.btnYavaslat.Size = New System.Drawing.Size(75, 23)
Me.btnYavaslat.TabIndex = 2
Me.btnYavaslat.Text = “Yava?lat”
Me.btnYavaslat.UseVisualStyleBackColor = True        ‘        
‘Label1        ‘        
Me.Label1.AutoSize = True
Me.Label1.Location = New System.Drawing.Point(166, 102)
Me.Label1.Name = “Label1”
Me.Label1.Size = New System.Drawing.Size(31, 13)
Me.Label1.TabIndex = 3
Me.Label1.Text = “H?z : “        ‘        
‘HighlightLabel1        ‘        
Me.HighlightLabel1.AutoSize = True
Me.HighlightLabel1.Font = New System.Drawing.Font(“Microsoft Sans Serif”, 18.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(162, Byte))
Me.HighlightLabel1.HighlightSpeed = 5
Me.HighlightLabel1.IsHighlightEnabled = True
Me.HighlightLabel1.Location = New System.Drawing.Point(12, 32)
Me.HighlightLabel1.Name = “HighlightLabel1”
Me.HighlightLabel1.Size = New System.Drawing.Size(372, 29)
Me.HighlightLabel1.TabIndex = 0
Me.HighlightLabel1.Text = “Bu bir yan?p s?nen uyar? etiketidir.”        ‘        ‘Form3        ‘        
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(388, 132)
Me.Controls.Add(Me.Label1)
Me.Controls.Add(Me.btnYavaslat)
Me.Controls.Add(Me.btnHizlandir)
Me.Controls.Add(Me.HighlightLabel1)
Me.Name = “Form3”
Me.Text = “Form3”
Me.ResumeLayout(False)
Me.PerformLayout()

End Sub
Friend WithEvents HighlightLabel1 As WindowsApplication1.HighlightLabel
Friend WithEvents btnHizlandir As System.Windows.Forms.Button
Friend WithEvents btnYavaslat As System.Windows.Forms.Button
Friend WithEvents Label1 As System.Windows.Forms.Label
End Class

 

Form3.vb
Public Class Form3

Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.HighlightLabel1.StartLabelHighlight()

‘Me.HighlightLabel1.StopLabelHighlight()

‘Me.HighlightLabel1.IsHighlightEnabled = True        
‘Me.HighlightLabel1.HighlightSpeed = 10

AddHandler Me.HighlightLabel1.HighlightSpeedChanged, AddressOf HighlightLabel1_HighlightSpeedChanged

Me.Label1.Text = “H?z : “ & Me.HighlightLabel1.HighlightSpeed.ToString()

End Sub

Private Sub btnHizlandir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHizlandir.Click
Me.HighlightLabel1.HighlightSpeed += 5
End Sub

Private Sub btnYavaslat_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnYavaslat.Click
Me.HighlightLabel1.HighlightSpeed -= 5
End Sub

Private Sub HighlightLabel1_HighlightSpeedChanged(ByVal value As Integer)
Me.Label1.Text = “H?z : “ & value.ToString()
End Sub

End Class

Sonuç :

HighlightSpeed” özelliği ile hızlandırabilir ya da yavaşlatabilirsiniz..

IsHighlightEnabled” özelliği ile etkisizleştirebilirsiniz..

HighlightSpeedChanged” olayını yönetebilirsiniz..

 Resim 1Resim 1  Resim 2Resim 2
 Resim 3Resim 3 Resim 4Resim 4
 Resim 5Resim 5

RadControls – Select RadGridView GroupRowInfo

Eğer RagGridView üzerinde Gruplama işlemine izin veriyorsanız ve bir satır seçildiğinde özel bir işlem yapıyorsanız. Gruplama sonrasında RadGridView ‘ın oluşturduğu “Grup Satırlarınıseçince bir hata alabilirsiniz.. Bunun sebebi RadGridView’ın CurrentRow’unun bir “GridViewRowInfo” tipinde olmamasıdır. “GridViewGroupRowInfo” tipinde olmasıdır. Bu durumda seçilen bir grubun sahip olduğu satır varsa, ilk satırın seçilmesini isteyebilirsiniz..

'' DataGrid ?zerinde gruplama yap?ld?ysa ve grid ?zerinde grup sat?r? se?ilirse,'' GridViewGroupRowInfo tipindedir ve hata f?rlamamas? i?in kontrol edilir.
    If (Me.GridView1.CurrentRow.GetType Is GetType (Telerik.WinControls.UI.GridViewGroupRowInfo)) Then

        Dim rowInfo As Telerik.WinControls.UI.GridViewRowInfo = _
            DirectCast(Me.GridView1.CurrentRow, Telerik.WinControls.UI.GridViewRowInfo)
        Dim groupRowInfo As Telerik.WinControls.UI.GridViewGroupRowInfo = _
            DirectCast(rowInfo, Telerik.WinControls.UI.GridViewGroupRowInfo)
        Dim dataGroup As Telerik.WinControls.UI.DataGroup = _
            DirectCast(groupRowInfo.Group, Telerik.WinControls.UI.DataGroup)

        If (dataGroup.RowCount > 0) Then        
            Me.GridView1.CurrentRow = dataGroup.Item(0)    
        Else        
            Exit Sub    
        End If
    End If

VB,CS – ApplicationEvents.vb ve program.cs ile Uygulama Genel İşlemleri

Uygulamalarımda ihtiyaç duyduğum işlemlerin başında tek bir noktadan uygulama login işlemlerini ve hata kaydetme işlemlerini yönetebilmektir. Login işlemi belki buna pek uymadı. Çünkü zaten tek bir login bölümü olur ve kullanıcı buradan uygulamaya giriş yapar. Peki şöyle bir durumda ne yapacaksınız. solution(çözümünüzde) projelerini yer almaktadır. Fakat bu projelerimizden biri genelde “Test Projemiz” olur. Bu durumda genelde test projesinde login bölümünü koymayız. Hızlı bir şekilde, bir test kullanıcı adı ve şifresi ile girilmiş gibi bilgisayarı kandıracak kodu “Form_Load” olayına yazarız yada bunu bir Class yapar ve Form açılışında bu Class’ın işlemesini sağlarız. Tabii ki test işlemlerimiz bazen tek form üzerinde yapabiliriz ama genelde Test projesi fazlaca form içerir ve bu form’ların her birinde bir test işlemi yer alır. Dolayısı ile bu form’ların her birinde login işlemini yapan class’ın çalışmasını isteriz..

Bu gibi durumlar bana baya can sıkıcı gelir ve buna genel bir çözüm bulmak isteriz. İşte burada yardımıza “ApplicationEvents.vb” Class’ı koşar. Bu .vb dosyasının oluşması için aşağıdaki adımları izlemelisiniz..

Projenize sağ tıklayıp “Properties” seçiniz..

Projenize sağ tıklayı Properties seçin.

“Application” sekmesinde “View Application Events” butonuna bastığınızda projenizde “ApplicationEvents.vb” class’ı “Partial” olarak oluşacaktır. Otomatik olarak ekrana gelecektir.

Application Events.vb dosyasının oluşturulması.

Proje içinde Application Events.vb

Bu class açıldığında artık yazının başında anlattığımız sorunlara bir çözüm olacağını umuyoruz. 🙂 Aslında biliyoruz ama çaktırmıyoruz 😉 ApplicationEvents.vb dosyası açıkken kod ekranının “ClassName” ve “MethodName” kısımlarındaki açılır listeyi kullanarak istediğimiz olay da işlem yapabiliriz.

Örneğin test projesinde uygulama başlangıç form’u hangi form seçilirse seçilsin. Login işlemini “MyApplication_Startup” metodu içinde yapabiliriz. Bu metod uygulama başladığında tetiklenir.

image

image

Örnek olarak böyle kodlayabiliriz..

Namespace My
    ' The following events are available for MyApplication:       
    ' Startup: Raised when the application starts, before the startup form is created.    
    ' Shutdown: Raised after all application forms are closed.  This event is not raised if the application terminates abnormally.    
    ' UnhandledException: Raised if the application encounters an unhandled exception.    
    ' StartupNextInstance: Raised when launching a single-instance application and the application is already active.
    ' NetworkAvailabilityChanged: Raised when the network connection is connected or disconnected.    
    Partial Friend Class MyApplication
        '' Uygulama ba?lang?c?nda..        
        Private Sub MyApplication_Startup(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles Me.Startup
            '' Login i?lemleri..           
            UserInfo.UserName = "Murat"
            UserInfo.UserSurname = "Ba?eren"
        End Sub
    End Class
End Namespace

Uygulama içinde yönetilmeyen bir hata olduğunda bunu yönetmek içinde bu kısımdaki metodlardan yararlanabiliriz. Yönetilmeyen kod’dan kastımız bir “Try..Catch” yapısı ile kontrol edilmeyen kodlama kısımlarıdır. Onun içinde “MyApplication_UnhandledException” metodu işimizi görecektir.

'' Y?netilmeyen hatalarda..
Private Sub MyApplication_UnhandledException(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException
    MessageBox.Show("Hata olu?tu. Kaydedildi.", "Hata Olu?tu.", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1)
    My.Application.Log.WriteException(e.Exception)
    e.ExitApplication = False
End Sub

Uygulamadan çıkarken bir işlem yapılabileceği gibi diğer metotları da kullanabilirsiniz.

Tabii ki bu işlemlerin Visual Basic tarafıydı. C# ‘ta ApplicationEvents.cs class’ını aramaya kalktığınızda projenizin özellikleri ekranında VB ‘deki gibi bir class’ı oluşturan buton bulamayacaksınız.. Bunun sebebi; C# ‘da o Class’ın zaten oluşmuş olmasıdır. İsmi de “Program.cs” dir.

Yukarıdaki işlemlerin benzerleri C# da aşağıdaki gibi kodlanarak elde edilir.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace ApplicationEventsCS
{
    static class Program
    {

        [STAThread]
        static void Main() {
            // VB'deki MyApplication_Startup e?leni?i metot budur.            
            // Y?netilmeyen hatalar?n yakalanaca?? olay..            
            Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }

        static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) {
            MessageBox.Show("Hata olu?tu. Kaydedildi.", "Hata Olu?tu.", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
            Microsoft.VisualBasic.Logging.Log log = new Microsoft.VisualBasic.Logging.Log();
            log.WriteException(e.Exception);
        }
    }
}

“Microsoft.VisualBasic.Logging.Log” sınıfını kullanabilmek için “Microsoft.VisualBasic” referansını projenize eklemeyi unutmayınız..

VB,CS – Baştan Sona Loglama (Logging)

Uygulama geliştirirken ya da geliştirdikten sonra en çok gerek duyduğumuz işlem sağlıklı bir hata loglama yapısıdır. Çünkü bu işlem uygulamayı Test ortamından tutunda canlı ortama kadar ve hatta uygulamanın hayatı boyunca ihtiyaç duyulacak en önemli kısımdır.

Uygulamanın aktardığınız ortamda ilk açılışından kaldırılıncaya kadar her zaman sağlıklı bir hata loglama ile oluşan hataların ve sorunların elinize geçmesi çok önemli ve hayat kurtarıcıdır. Genelde aktarılan ortamda uygulama ilk aktarıldığında biraz nazlı olur 🙂 Tabii bu naz uygulamanın çalışmasını zorlaştırır. 🙂 İşte bu durumlarda sağlıklı bir hata loglama yapısı yoksa hatayı bulmak ölümcül zaman kayıplarına neden olabilir. Hatta genelde öldürür !! 🙂 Aynı za

man da uygulama çalıştığı süre boyunca yani hayatı boyunca kullanıcıların sebep olduğu veya olmadığı her türlü hatanın yakalanması, kaydedilmesi(hata loglama), bilgi kaydedilmesi(loglama), izlenebilmesi vs. Sizi köşeye sıkışacağınız bir anda kurtarıcı bir kapınız olmasını sağlayacaktır. Yoksa kullanıcının makinasındaki uygulamayı debug etmeyi mi düşünüyordunuz.. 🙂 Bir silah alıp kafanıza sıkın daha rahat olur.. :))

Neyse sözü uzatmadan bu işlemlerde elimizde ki silahları sizinle paylaşmak istiyorum. Tabii ki olayımız çok açık ve seçik olarak en az kodla bu işi nasıl yaparız. 🙂 Hatta mümkünse hiç kod yazmasak süper  olmaz mı !? :)) Bence müthiş olur..

Bizi kurtaracak dosyamızın adı; App.config

Bu dosya içinde yapacağımız loglama ayarları ile uygulamamızda bir tek satırda loglama işlemini halledebiliriz. Sadece hata loglama değil, uygulama içinde herhangi bir anda kayıt altına alınmasını istediğimiz verileri bile bu şekilde kaydedebiliriz.

MSDN ‘den araştırdığım sayfalar sonucunda şu şekilde App.config dosyasını düzenledim.

App.config dosyasında ki “configuration” bölümü altında “system.diagnostics” altında “sources” , “switches” , “sharedListeners” kısımlarından oluşmaktadır. Burada “sources” kısmında loglama yapıları kısa bir tanımlama yapılmaktadır. “sharedListeners” kısmında ise “sources” kısmında tanımlanan her “source” için ayrıntılar belirtilmektedir.

VB projelerinde, projemize bir App.config dosyası eklediğimizde, bu kısımlar otomatik olarak oluşmaktadır. Fakat sadece “FileLog” seçeneği gelmektedir. Fakat MSDN araştırmam sonucunda diğerlerini de yazdım.

CS projelerinde, projemize bir App.config dosyası eklediğimizde, bu kısımların hiçbiri ama hiçbiri ama ama hiçbiri gelmiyor. Fakat VB projesinde oluşan kodları aynen kopyalayabilirsiniz..

Her bir loglama yapısını açıklama yazıları ile belirttim. Her bir “sources” için detaylarının olduğu “sharedListeners” alanında “log dosyasının oluşturulacağı konumu” ve diğer ayarlarını görebilir ve değiştirebilirsiniz..

<configuration>
  <system.diagnostics>
    <sources>
      <source name="DefaultSource" switchName="DefaultSwitch">
        <listeners>
          <add name="FileLog"/>
          <add name="EventLog"/>
          <add name="FileLogListener" />
          <add name="Delimited" />
          <add name="XmlWriter" />
          <add name="Console" />
        </listeners>
      </source>
    </sources>

    <switches>
      <add name="DefaultSwitch" value="Information" />
    </switches>

    <sharedListeners>
                       <add name="FileLog" type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"initializeData="FileLogWriter"/>

      <add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="ApplicationEventsVB"/>

                       <add name="FileLogListener" type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"initializeData="FileLogListenerWriter" location="Custom" customlocation="C:\VB\\cf0 " />

                       <add name="Delimited" type="System.Diagnostics.DelimitedListTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" initializeData="C:\VB\ApplicationEvents.txt" delimiter=";"traceOutputOptions="DateTime" />

      <add name="XmlWriter" type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0,                  Culture=neutral, PublicKeyToken=b77a5c561934e089" initializeData="C:\VB\ApplicationEvents.xml" />
      <add name="Console" type="System.Diagnostics.ConsoleTraceListener, System, Version=2.0.0.0,                  Culture=neutral, PublicKeyToken=b77a5c561934e089" initializeData="true" />
    </sharedListeners>
  </system.diagnostics>
</configuration>

Bu loglama seçeneklerinden uygulanmasını istemediklerinizi “açıklama” satırı yapmanız yeterlidir.

Aktif olanların hepsi sırası ile uygulanacaktır..

Bu işlemlerden sonra uygulama kodunuz içinde herhangi bir yerde ki özellikle “Try..Catch” bloğu içinde yada bilgi kaydedilmesini istediğiniz bir yerde aşağıdaki kodu yazarak ve diğer “aşırı yüklenmiş (overload)” versiyonlarına bakarak işlem yapabilirsiniz..

VB Projelerinde;

My.Application.Log” nesnesini kullanarak App.config içinde aktifleştirdiğimiz loglama yapılarının sırasıyla gerçekleşmesini sağlamış oluruz..

My.Application.Log.WriteException(New Exception("Bu bir hata mesaj?d?r.."))
My.Application.Log.WriteEntry("Bu bir bilgi kaydetme i?lemidir..")

CS Projelerinde;

Ufak bir işlem ile aynı nesneyi kullanabiliriz… “App.config” dosyamız VB projesindekinin aynısı olacaktır. Ardından projemize “References” kısmında “Microsoft.VisualBasic” referansını projemize eklememiz yeterlidir.

image

image

image

Bu işlemlerden sonra kodumuz aşağıdaki gibidir..

Microsoft.VisualBasic.Logging.Log log = new Microsoft.VisualBasic.Logging.Log();
log.WriteException(new Exception("Bu bir deneme hatas?d?r."));
log.WriteEntry("Bu bir deneme bilgisidir..");

LOGLAMA ÖRNEKLERİ..

XML Loglama..

<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">
  <System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system">
    <EventID>0</EventID>
    <Type>3</Type>
    <SubType Name="Information">0</SubType>
    <Level>8</Level>
    <TimeCreated SystemTime="2010-03-28T15:28:24.0563348Z" />
    <Source Name="DefaultSource" />
    <Correlation ActivityID="{00000000-0000-0000-0000-000000000000}" />
    <Execution ProcessName="ApplicationEventsVB.vshost" ProcessID="4216" ThreadID="10" />
    <Channel/>
    <Computer>BILMEMNEPC</Computer>
  </System>
  <ApplicationData>Bu bir test hatas?d?r.</ApplicationData>
</E2ETraceEvent>

Delimited loglama..

"DefaultSource";;;Information;;;0;;;"Deneme99";;;;;;;;;;;;;;;"2010-03-28T15:26:29.0977595Z";;;;;; "DefaultSource" ||| Information ||| 0 ||| "Deneme99" ||| ||| ||| ||| ||| "2010-03-28T15:28:24.0563348Z" ||| |||

Konuyla ilgili MSDN sayfaları;

http://msdn.microsoft.com/en-us/library/5cz98azz(VS.80).aspx
http://msdn.microsoft.com/en-us/library/xbw77c0x(VS.80).aspx
http://msdn.microsoft.com/en-us/library/3tbf1bh0(VS.80).aspx
http://msdn.microsoft.com/en-us/library/7fx0fexe(VS.80).aspx
http://msdn.microsoft.com/en-us/library/f9shkfdd(VS.80).aspx
http://msdn.microsoft.com/en-us/library/12xxftw2(VS.80).aspx