KMRT BSRN

"Hiç kimsenin ilgisine ihtiyaç duymadığın gün olgunlaşırsın. Hiç kimseden beklentiye girmediğin gün yara almazsın. Ve hiç kimseye bağımlı kalmazsan kazanırsın." OSHO


2 Yorum

ASP.NET MVC Yazılımcıların Yükselişi

gorsel

Yeni bir eğitim için kolları sıvamış bulunuyorum. Aslında birçok kişi tarafından sürekli istenen bir eğitimdi. Bende yarattığım fırsatlarda bu eğitimi hazırlamaya karar verdim. Şu an eğitimin tüm videoları tamamlanmamış durumda ama son hızla tamamlamak için fırsat buldukça uğraşıyorum. Umarım ortaya güzel bir eğitim çıkar ve bekleyenleri memnun eder. Şu an yaklaşık 8 saatlik bir video serisi çıkmış durumda ama benim öngörüm bu daha yolun yarısı, eğitimi merak edenler için aşağıda tanıtım videosunu ve link’ini paylaşıyor olacağım. Kendiniz de henüz yayınlanmamış bölümleri gördüğünüzde ne demek istediğimi anlayacaksınız.

Eğitim içeriğinde ASP.NET MVC temellerinden başlayarak tüm konulara değinmeye çalışıyor olacağım. Tasarım işlerini Bootstrap’Dan faydalanarak, veritabanı işlemlerini ise Entity Framework CodeFirst ile yapıyor olacağım. Eğitim sonunda 2 Bonus bölüm ve bir uygulama örneği yapıyor olacağım.

Eğitimi bunlarla sınırlamak istemiyorum. Dolayısı ile zamanla fazladan bölüm ekleme ve yenilikleri yine aynı eğitim üzerinden anlatarak eğitimi genişletmeyi düşünüyorum.

ASP.NET MVC Eğitimi için tıklayınız.

Tüm Eğitimlerim için tıklayınız.

ASP.NET MVC Eğitimi by Kadir Murat Başeren

Eğitim içeriğini aşağıda görebilirsiniz;

  • ASP.NET MVC Giriş
  • Razor Syntax (Sözdizimi)
  • Views
  • Controller & View Arası İletişim
  • Models ve Model Binding
  • Bootstrap Framework ve Helper Metotlar
  • Entity Framework CodeFirst Entegrasyonu
  • Entity Framework CodeFirst ile Veritabanı İşlemleri
  • Auto-Generated Views
  • ActionResult Türleri
  • Action Attributes
  • Routing
  • BundleConfig Yapılandırması
  • Durum Yönetimi
  • Validation
  • Filters
  • Ajax Helper Metodları
  • JQuery ile Ajax İşlemleri
  • Area
  • BONUS : Web Helpers
  • BONUS : Grid.MVC Entegrasyonu
  • Uygulama : MyEvernote Örneği

Gördüğünüz gibi dolu bir içerik sizleri ve benim çekmemi bekliyor. Ben üstesinden gelebileceğimi düşünüyorum. Umarım sizlerede bir faydası dokunur.

Şimdiden iyi seyirler ve başarılı projeler dilerim.

 

Visual Studio ile C# Programlama
ASP.NET MVC ile Grid.MVC Entegrasyonu
Reklamlar


Yorum bırakın

Entity Framework 6.0 ile Veri tabanı Tablolarındaki Ortak Kolonları Güncelleme

Geliştirmiş olduğunuz programlarınıza ait veri tabanlarında mutlaka aşağıdaki diyagramdaki gibi bir yapı geliştirmiş veya karşılaşmışsınızdır. Burada tablo isimleri veya aralarındaki bağlantı değil. Tablolarda bulunan ortak kolonları gözden kaçırmamanızı istiyorum. Basit olarak iki adet ortak kolonu 3 farklı tabloya ekledim. Bu kolonlar “lud(last updated date – son güncellenme tarihi)” ve “cdate(create date – oluşturulma tarihi)” isimli kolonlardır. Tabii ki ben konuyu anlatmak için sadece bu iki kolonu ekledim.

Normalde; LastModifiedBy(Son güncelleyen) , LastModifiedAt(Son güncelleme tarihi), CreatedBy(Oluşturan) ve CreatedAt(oluşturulma tarihi) şeklinde 4 adet kolonu barındırması daha doğru olacaktır.

Entity Framework 6.0 ile Veri tabanı Tablolarındaki Ortak Kolonları Güncelleme

 

Basit bir form üzerinden örneğimizi yapalım.

Entity Framework 6.0 ile Veri tabanı Tablolarındaki Ortak Kolonları Güncelleme

Ekranda gördüğünüz 3 listbox’a veri tabanındaki uygun verileri dolduruyorum. Listbox’ların üstündeki GroupBox başlıklarından hangisine hangi verinin dolduğunu anlayabilirsiniz. Tabii burada Telefon Numaraları isimli listbox’ın verisi Kişiler isimli listbox’dan seçilen kişi olduğunda doluyor. Her listbox’ın üstünde bulunan “Yeni” ikonu ile yeni kayıt ekleme işlemini, “Kaydet” ikonu ile de kayıtları güncelleme işlemini ilgili tabloya yapıyorum.

Buradaki amaç yeni kayıt ekleme ve güncelleme işlemlerinde ortak olan kolonları(lud ve cdate) otomatik olarak yazacağımız merkezi bir kod ile güncelleme, sürekli olarak işlem yapılan tablolarda bu kolonları işlemek içinde kod yazmak çok mantıklı değil.. Fakat tabii ki özel işlemler söz konusu ise yazılabilir.

Örnek veri tabanı script’ini yazının sonunda bulabilirsiniz. Sql script’i veri tabanınızda çalıştırdığınızda veri tabanı, tabloları ve örnek veriler yüklenecektir. Ardından bir windows form application (C#) projesi açarak yukarıdaki görünümde bir form tasarlayabilirsiniz.

Projenize ADO.NET Entity Data Model ekleyerek veri tabanına bağlanıp gerekli tabloları seçiniz. Ben isim olarak “TestDbModel” verdim.

Entity Framework 6.0 ile Veri tabanı Tablolarındaki Ortak Kolonları Güncelleme

Bu işleminde ardından form’un arkasına yazacağımız kodlar şu şekildedir.

public partial class Form1 : Form
{
    private TestDbEntities Entity = new TestDbEntities();
    private Random Rnd = new Random();

    public Form1()
    {
        InitializeComponent();

        this.btnNewKisi.Click += btnNewKisi_Click;
        this.btnSaveKisi.Click += btnSaveKisi_Click;
        this.btnNewTelNo.Click += btnNewTelNo_Click;
        this.btnSaveTelNo.Click += btnSaveTelNo_Click;
        this.btnNewNot.Click += btnNewNot_Click;
        this.btnSaveNot.Click += btnSaveNot_Click;
        this.lstKisiler.SelectedIndexChanged += lstKisiler_SelectedIndexChanged;

    }

    private void Form1_Load(object sender, EventArgs e)
    {
        this.LoadKullanicilar();
        this.LoadNotlar();
    }

    private void btnNewKisi_Click(object sender, EventArgs e)
    {
        // Yeni kullanıcı kayıdı veritabanına yapılır.
        int kno = this.lstKisiler.Items.Count + 1;

        Kullanici k = new Kullanici();
        k.ad = "Kullanıcı-" + kno.ToString();
        k.soyad = "Kullanıcı-" + kno.ToString();

        // Dikkat ederseniz burada lud ve cdate kolonlarına 
        // bir veri yazma işlemi yoktur.

        this.Entity.Kullanici.Add(k);
        this.Entity.SaveChanges();

        this.LoadKullanicilar();
    }

    private void btnSaveKisi_Click(object sender, EventArgs e)
    {
        if (this.lstKisiler.SelectedIndex > -1)
        {
            // Eğer kullanıcı seçilmiş ise ad ve soyadı sonuna x yazılır.
            Kullanici k = this.lstKisiler.SelectedItem as Kullanici;

            k.ad += "x";
            k.soyad += "y";

            // Dikkat ederseniz burada lud ve cdate kolonlarına 
            // bir veri yazma işlemi yoktur.

            this.Entity.SaveChanges();
            this.LoadKullanicilar();
        }
    }

    private void btnNewTelNo_Click(object sender, EventArgs e)
    {
        if (this.lstKisiler.SelectedIndex > -1)
        {
            // Eğer kullanıcı seçilmiş ise yeni telefon numarası
            // rastgele oluşturularak eklenir.
            Kullanici k = this.lstKisiler.SelectedItem as Kullanici;

            TelNo t = new TelNo();
            t.KullaniciID = k.id;
            t.TelNo1 = this.Rnd.Next(100, 999).ToString();

            // Dikkat ederseniz burada lud ve cdate kolonlarına 
            // bir veri yazma işlemi yoktur.

            this.Entity.TelNo.Add(t);
            this.Entity.SaveChanges();

            this.LoadTelNolar();
        }
    }

    private void btnSaveTelNo_Click(object sender, EventArgs e)
    {
        if (this.lstTelNolar.SelectedIndex > -1)
        {
            // Eğer telefon numarası seçilmiş ise seçili numara
            // sonuna "0" eklenerek güncellenir.
            TelNo t = this.lstTelNolar.SelectedItem as TelNo;

            t.TelNo1 += "0";

            // Dikkat ederseniz burada lud ve cdate kolonlarına 
            // bir veri yazma işlemi yoktur.

            this.Entity.SaveChanges();
            this.LoadTelNolar();
        }
    }

    private void btnNewNot_Click(object sender, EventArgs e)
    {
        // Yeni bir not oluşturularak kaydedilir.
        Note n = new Note();
        n.NoteVal = this.Rnd.Next(10, 99);

        // Dikkat ederseniz burada lud ve cdate kolonlarına 
        // bir veri yazma işlemi yoktur.

        this.Entity.Note.Add(n);
        this.Entity.SaveChanges();

        this.LoadNotlar();
    }

    private void btnSaveNot_Click(object sender, EventArgs e)
    {
        if (this.lstNotlar.SelectedIndex > -1)
        {
            // Seçili not değeri +/- 3 olarak güncellenir.
            Note n = this.lstNotlar.SelectedItem as Note;

            if (n.NoteVal < 98)
                n.NoteVal += 3;
            else
                n.NoteVal -= 3;

            // Dikkat ederseniz burada lud ve cdate kolonlarına 
            // bir veri yazma işlemi yoktur.

            this.Entity.SaveChanges();
            this.LoadNotlar();
        }
    }

    private void lstKisiler_SelectedIndexChanged(object sender, EventArgs e)
    {
        this.LoadTelNolar();
    }



    private void LoadNotlar()
    {
        this.lstNotlar.DisplayMember = "NoteVal";
        this.lstNotlar.ValueMember = "ID";
        this.lstNotlar.DataSource = Entity.Note.ToList();
    }

    private void LoadKullanicilar()
    {
        this.lstKisiler.DisplayMember = "ad";
        this.lstKisiler.ValueMember = "id";
        this.lstKisiler.DataSource = Entity.Kullanici.ToList();
    }

    private void LoadTelNolar()
    {
        if (this.lstKisiler.SelectedIndex > -1)
        {
            Kullanici k = this.lstKisiler.SelectedItem as Kullanici;

            this.lstTelNolar.DisplayMember = "TelNo1";
            this.lstTelNolar.ValueMember = "ID";
            this.lstTelNolar.DataSource = Entity.TelNo.Where(x => x.KullaniciID == k.id).ToList();
        }
    }
}

Peki en önemli kısma geldik. EF ‘ün “SaveChanges“ metodu çalıştırıldığında yeni eklenmiş entity nesnelerinde ve Güncelleme yapılan entity nesnelerinde gerekli kolonları işlemeliyiz. Tablo ayrımı olmadan..! Kodlar üzerinde gerekli açıklamaları yaptım ama burada da kısaca değinmek istiyorum.

TestDbEntities” class’ımız bir partial class olduğu için aynı isimli ve partial ifadesi geçen bir class oluşturuyoruz. Böylece aslında “TestDbEntities” class’ının devamını yazmaya başlamış oluyoruz. Ardından “SaveChanges” metodunu “Override” ederek eziyoruz ve save işlemi öncesine kendi kodlarımızı yazıyoruz. Bu kodlarda insert ve update edilecek entity nesnelerini elde edip, insert edilecekler de “cdate” kolonunu ve “lud” kolonunu, update edilecek entity nesnelerinde ise sadece “lud” kolonunu işleyecek şekilde kodlarımızı yazıyoruz. Farklı iki şekilde yazdım. İki şekilde de uygundur hangisi kolayınıza geliyorsa onu kullanabilirsiniz.

public partial class TestDbEntities
{
    public override int SaveChanges()
    {
        // Added(insert edilecekler) ve Modified(update edilecekler) elde edilir.
        List<DbEntityEntry> changesList =
            this.ChangeTracker.Entries().Where(
            x => x.State == System.Data.Entity.EntityState.Added ||
                x.State == System.Data.Entity.EntityState.Modified).ToList();

        foreach (DbEntityEntry entry in changesList)
        {
            // Eğer insert edilecek ise cdate özelliği de yazılır.
            if (entry.State == System.Data.Entity.EntityState.Added)
            {
                // 1. yol : entry.CurrentValues özelliği ise işlem yapma..
                if (entry.CurrentValues["cdate"] != null)
                    entry.CurrentValues["cdate"] = DateTime.Now;
            }

            // ister update ister insert olsun lud yazılır.
            // 2. yol : entry.Property özelliği ise işlem yapma..
            if (entry.Property("lud") != null)
                entry.Property("lud").CurrentValue = DateTime.Now;
        }

        // Savechanges metodumuz kaldığı yerden devam ediyor.
        return base.SaveChanges();
    }
}

Görüldüğü üzere gerekli “lud” ve “cdate” verileri yazılmış. Yeni veriler eklenmiş ve güncellenecek olanlar güncellenmiştir.

Entity Framework 6.0 ile Veri tabanı Tablolarındaki Ortak Kolonları Güncelleme

 

Proje dosyaları için tıklayınız..


Yorum bırakın

Visual Studio 2012’de Entity Framework CodeGenerationStrategy ve WCF Sorunu

Visual Studio 2012 ile çalışırken EntityFramework ve WCF ‘i bir arada kullanıyorsanız muhtemelen birkaç sorun ile karşılaşacaksınız. Ben bu sorun ile silverlight uygulaması geliştirirken bir şekilde tanışmış oldum. Öncelikle senaryomuzdan bahsetmek istiyorum.

Sorunun Tespiti;

Visual Studio 2012 ile bir silverlight uygulaması geliştirmek için gerekli projeyi oluşturdum. Projeyi .Net Framework 4.0 ve Silverlight 5 versiyonlarını kullanarak geliştirmek üzere ön ayarlamalarını yaptıktan sonra projemiz planlandığı gibi visual studio 2012 ile oluşturuluyor. Elimizde ilişkili tablolar bulunan bir SQL veritabanı mevcut. Ardından ASP.NET projemize ADO.NET Entity Data Model (EF) ekliyoruz. Modelimiz veritabanından ilişkilendirilmiş tablolarımızı okuyarak ilgili kod üretme işlemini gerçekleştiriyor. ASP.NET projemize silverlight uygulamamız ile veri alışverişinde bulunmak üzere bir WCF servisi ekliyoruz. İlişkili herhangi bir tablodan veri okuyan basit bir metot ekliyoruz. Ardından silverlight uygulamamıza WCF servisimizi Service Reference olarak ekliyoruz. Silverlight uygulamamızdan ilgili metodu çağırdığımız da servis cevabı alınamadığına dair bir hata ile karşılaşacağız. (Bu hata ilişkisiz bir tablodan veri okurken değil ilişkisi bulunan bir tablodan veri okurken meydana geliyor.)

Projenin Oluşturulması

Silverlight Projesinin Ayarlanması

ADO.NET Entity Data Model Eklenmesi

WCF Servisinin Eklenmesi

Silverlight Uygulamasına WCF Servis Eklenmesi ve Kodlama

Silverlight Uygulamasının Çalıştırılması

The remote server returned an error: NotFound.

Oluşan hata şekilden de görüldüğü gibidir. “The remote server returned an error: NotFound.

 

Sorunun Çözümü;

Yukarıda anlattığım  proje adımlarını Visual Studio 2010 ile gerçekleştirdiğinizde böyle bir sorun ile karşılaşmıyorsunuz. Projeniz sağlıklı bir şekilde çalışıyor.

  1. İlk düşündüğüm, Visual Studio 2012 ile gelen Entity Framework ‘ün versiyonunun yükselmiş olmasından kaynaklandığını düşündüm. Visual Studio 2012 üzerindeki projemdeki Entity Framework versiyonunu düşürmeye çalıştım. Bu sonucu etkilemedi.
  2. İkinci düşündüğüm, WCF servisi için yeni bir güncelleme  ya da versiyon yayınlanmış olabileceği ve benim bunu yüklemememden kaynaklı olabileceği idi. Araştırmalarım beni “WCF Data Services 5.2 RTM Tools for Visual Studio 2010/2012” ‘ye yönlendirdi. WCF servis ile ilgili bazı hataları gideren bu Tools’u yükledim. Sorunun çözümüne yaklaştığımı ve sonunda olduğunu düşünürken, tekrar aynı hata ile karşılaşmak çok can sıkıcıydı. Bu da sonucu etkilemedi.
  3. Üçüncü düşündüğüm, Entity Framework’ün ürettiği kod ‘dan şüphelenmem sonucunda oldu. Visual Studio 2012 üzerinde eklediğim ADO.NET Entity Data Model nesnesi ile projeye bir sürü yeni dosya eklendiğini fark ettim. Ayrıca üretilen koddaki miras alınan nesne de farklıydı. Neyden farklıydı diye sorduğunuzu tahmin ediyorum, Visual Studio 2010’da eklediğim ADO.NET Entity Data Model nesnesinden farklı birçok dosya ve kod söz konusuydu. Düşündüm ki eğer Visual Studio 2010 ‘daki kod sorunsuz çalışıyor ise, visual studio 2012 ‘de üretilen kod’a karşı WCF servisi gerekli tepkiyi gösteremiyor. Benim yapmam gereken Visual Studio 2012’de Visual Studio 2010’daki gibi ADO.NET Entity Data Model nesnesinin kod üretmesini sağlamak olmalı !! Bu sefer araştırmamı bunun üzerinde gerçekleştirdim. Ulaştığım bir yazıya buradan ulaşabilirsiniz. Ardından çözüme daha da çok yaklaştıran yazıya da buradan ulaşabilirsiniz. Tabii ki yapılacakları kısaca burada açıklayacağım.

Öncelikle sorun;

ADO.NET Entity Data Model nesnesinin kod üretme şeklinde(bu kesinleşti)

  • Visual Studio 2012 ‘de ADO.NET EF Modelinizi çift tıklayarak designer’ı açın.
  • Designer’da boş bir yere tıklama yaptığınızda “Properties” pencerenizde ilgili özellikler gelecektir.

image

  • Properties penceresindeki “Code Generation Strategy” özelliğinin değerini “Default” olarak değiştirin.

image

  • Ardından Solution Explorer’da Model’inize ait “*.tt” uzantılı dosyaları silin.

image

  • Modelinizin bulunduğu projenizi “Rebuild” ile yeniden derleyin.

image

  • Projenizi F5 ile çalıştırdığınızda WCF servisinizin sorun vermeden çalıştığını göreceksiniz.

 

Çözüm basit görünüyor. Sorunun tespitinde baya bir uğraştığımı ve farklı senaryolar düşündüğümden farklı noktalara gittiğimi farketmişsinizdir. Burada kolayca okuduğunuz bu sorun beni 3-4 gündür oyalıyordu. Açıkçası işimi Visual Studio 2010 üzerinden götürdüm fakat sorunu çözmem beni çok sevindirdi. Sizin içinde aynı şekilde hissettireceğiniz düşünüyorum.

 

#amenities


Yorum bırakın

Entity Framework Code First için Doğrulama(Validation) Stratejileri Webiner(Webcast) Kayıtları

Burak Selim Şenyurt’tan,

Entity Framework Code First için Doğrulama(Validation) Stratejileri Webiner(Webcast) Kayıtları

http://www.buraksenyurt.com/post.aspx?id=d0b8dcfc-d8c9-45ab-a46f-5a04e272dbea

Bu webinerde nitelik(attribute), arayüz(interface) ve metod ezme(override) gibi enstrümanlar yardımıyla, doğrulama işlemlerini çeşitli seviyelerde nasıl gerçekleştirebileceği anlatilmis.

Ayrıca özel doğrulama niteliklerinin(Custom Validation Attribute) nasıl yazılabileceğine de değinilmis.


Yorum bırakın

Zenith Bilişim – Entity Framework Eğitimi

Burak Selim Şenyurt’tan..

Zenith Bilişim – Entity Framework Eğitimi.


Yorum bırakın

Burak Selim Şenyurt’tan – Entity Framework ile Gerçek Hayat Örnekleri Webinerleri

Mutlaka planlamanızı tavsiye ederim. Bir Burak Selim Şenyurt fanatiği olarak ben takvimime ekledim. 🙂

Entity Framework ile Gerçek Hayat Örnekleri Webinerlerim.

Entity Framework ile Gerçek Hayat Örnekleri Webinerlerim


Yorum bırakın

RadTreeView Üzerinde Organizasyon Hiyerarşisi Oluşturma – Create Organization Hierarchy in RadTreeView

Herhangi bir amaç için bir organizasyon hiyerarşisi oluşturmak için kolları sıvıyoruz. Ne için bunu kullanabiliriz? Benim kullandığım amaç için olabilir; çalıştığınız kurumdaki çalışanlarınızın departman olarak hiyerarşisini göstermek, bir aile hiyerarşisini göstermek, ürün ya da hizmet hiyerarşisini göstermek olabilir. TreeView kontrolü üzerinde bu işlemi kolaylıkla yapabiliyoruz. Fakat bizim buradaki amacımız bu işlemi yaparken bir “OrganizationHierarchy” isimli ara sınıf üzerinden hiyerarşinin otomatik oluşturulmasını istiyoruz. Yani TreeView üzerinde “node” ‘lar ile uğraşmak istemiyoruz. Oluşturacağımız bu sınıf’a yapımızı çok daha anlaşılır ve kullanışlı olarak tanımlayacağız ve node oluşturma, node’a resim koyma işlemlerini bu sınıfın ilgili metoduna bırakacağız. Önce hedeflediğimiz yapıyı kısaca göstermek istiyorum.

Yazmak istediğimiz kod yapısı.
  1. // Departman tanimi..
  2. OrganizationHierarchyItem departman =
  3.     new OrganizationHierarchyItem(getPhotoFromDatabase: false, pName: "Yazilim Departmani");
  4.  
  5. // Calisanlarin tanimi..
  6. OrganizationHierarchyItem murat = new OrganizationHierarchyItem(photoWidth: 48, photoHeight: 64, pKullaniciID: 23916, getPhotoFromDatabase: true, pName: "Proje Muduru");
  7. OrganizationHierarchyItem murat1 = new OrganizationHierarchyItem(photoWidth: 48, photoHeight: 64, pKullaniciID: 23916, getPhotoFromDatabase: true, pName: "Yazilim Uzmani");
  8. OrganizationHierarchyItem murat2 = new OrganizationHierarchyItem(photoWidth: 48, photoHeight: 64, pKullaniciID: 23916, getPhotoFromDatabase: true, pName: "Yazilim Uzmani Yardimcisi");
  9. OrganizationHierarchyItem murat3 = new OrganizationHierarchyItem(photoWidth: 48, photoHeight: 64, pKullaniciID: 23916, getPhotoFromDatabase: true, pName: "Yazilim Uzmani");
  10.  
  11. departman.SubItems.Add(murat);
  12. murat.SubItems.Add(murat1);
  13. murat1.SubItems.Add(murat2);
  14. murat.SubItems.Add(murat3);
  15.  
  16. OrganizationHierarchy hierarchy = new OrganizationHierarchy();
  17. hierarchy.RootImage = Resources.commercial_building_icon48;     // Departman resmi.
  18. hierarchy.TreeViewControl = this.radTreeView1;                  // Hiyerarsinin olusturulacagi kontrol.
  19. hierarchy.Add(departman);
  20.  
  21. hierarchy.LoadHierarchy(hierarchy);

Yukarıdaki kod ‘da gördüğünüz üzere  “OrganizationHierarchy” ve “OrganizationHierarchyItem” isimli iki sınıf üzerinden bir hiyerarşi kurmak istiyoruz. Yapımız gayet basit. Bir “OrganizationHierarchyItem” ‘ın “KullanıcıID”, “PhotoWidth”, “PhotoHeight”, “GetPhotoFromDatabase” ve “Name” isimli özellikleri vardır. Ayrıca her “OrganizationHierarchyItem” kendi tipinden olan “SubItems” içerebilir. Yukarıda yazmak istediğimiz kod ise gayet basit. Bir yazılım departmanı, proje müdürü, iki tane yazılım uzmanı ve bir yazılım uzmanı yardımcısı tanımladım.. Alt kısmında ise hiyerarşiyi oluşturdum. Her oluşturduğum çalışanı, ait olduğu çalışanın altına ekliyorum. Departmanın altınada en baştaki çalışanı ekliyorum. Burada kurduğumuz yapıda çalışanlara ait resimlerin boyutlarının ne olacağı, resimlerin nereden çekileceği belirtiyorum. Bizim yapımızda resimler veritabanında bulunmaktadır. “KullanıcıID” ile bu resimleri veritabanından çekeceğim.

  1. murat – Proje Muduru
  2.     murat1 – Yazilim Uzmani
  3.         murat2 – Yazilim Uzman Yardimcisi
  4.     murat3 – Yazilim Uzmani

Şimdide “OrganizationHierarchy” ve “OrganizationHierarchyItem” yapılarını oluşturalım. TreeView’ı dolduracak olan yapı; “OrganizationHierarchy” ‘dir. Bu sebeple yazdığımız kod’da bu yapının hangi TreeView kontrolüne ilgili nesneleri dolduracağını da yukarıdaki kod üzerinde belirtiyoruz. Hatta departman için kullanacağı resmide kendisine veriyoruz. Sonrada ilgili departman nesnemizi ya da nesnelerimizi bu yapıya ekliyoruz.

Veritabanında ilgili tablomu ADO.NET Entity Framework kullanarak projeme ekliyorum.

image

OrganizationHierarchyItem.cs
  1. public class OrganizationHierarchyItem
  2. {
  3.  
  4.     private Image DEFAULT_PHOTO = TreeView.Properties.Resources.User_64x64;
  5.  
  6.     public int KullaniciID { get; set; }
  7.     public Image Photo { get; set; }
  8.     public Size PhotoSize { get; set; }
  9.     public string Name { get; set; }
  10.     public object Tag { get; set; }
  11.     public List<OrganizationHierarchyItem> SubItems { get; set; }
  12.  
  13.  
  14.     protected void SetDefaultValues()
  15.     {
  16.         this.Photo = this.DEFAULT_PHOTO;
  17.         this.PhotoSize = new Size(64, 64);
  18.         this.SubItems = new List<OrganizationHierarchyItem>();
  19.     }
  20.     protected Image GetKullaniciPhoto()
  21.     {
  22.         try
  23.         {
  24.             using (MyEntities entity = new MyEntities())
  25.             {
  26.                 tbl_kullaniciphoto kullanici =
  27.                     (from x in entity.tbl_kullaniciphoto
  28.                         where x.fld_kullaniciID == this.KullaniciID
  29.                         select x).FirstOrDefault();
  30.  
  31.                 if (kullanici != null)
  32.                 {
  33.                     MemoryStream memo = new MemoryStream(kullanici.fld_picture);
  34.                     return Image.FromStream(memo);
  35.                 }
  36.             }
  37.         }
  38.         catch (Exception)
  39.         {
  40.             return TreeView.Properties.Resources.User_64x64;
  41.         }
  42.  
  43.         return this.DEFAULT_PHOTO;
  44.     }
  45.     protected Image GetKullaniciPhoto(byte[] buffer)
  46.     {
  47.         if (buffer != null && buffer.Length > 0)
  48.         {
  49.             MemoryStream memo = new MemoryStream(buffer);
  50.             return Image.FromStream(memo);
  51.         }
  52.         else
  53.         {
  54.             return this.DEFAULT_PHOTO;
  55.         }
  56.     }
  57.  
  58.  
  59.     public OrganizationHierarchyItem()
  60.     {
  61.         this.SetDefaultValues();
  62.     }
  63.     public OrganizationHierarchyItem(Size pPhotoSize, int pKullaniciID = -1, Image pPhoto = null, string pName = "")
  64.     {
  65.         this.SetDefaultValues();
  66.  
  67.         this.KullaniciID = pKullaniciID;
  68.         this.Photo = pPhoto;
  69.         this.PhotoSize = pPhotoSize;
  70.         this.Name = pName;
  71.     }
  72.     public OrganizationHierarchyItem(Size pPhotoSize, int pKullaniciID = -1, byte[] photoBuffer = null, string pName = "")
  73.     {
  74.         this.SetDefaultValues();
  75.  
  76.         this.Name = pName;
  77.         this.PhotoSize = pPhotoSize;
  78.         this.KullaniciID = pKullaniciID;
  79.         this.Photo = this.GetKullaniciPhoto(photoBuffer);
  80.     }
  81.     public OrganizationHierarchyItem(Size pPhotoSize, int pKullaniciID = -1, bool getPhotoFromDatabase = true, string pName = "")
  82.     {
  83.         this.SetDefaultValues();
  84.  
  85.         this.KullaniciID = pKullaniciID;
  86.         this.Name = pName;
  87.         this.PhotoSize = pPhotoSize;
  88.  
  89.         if (getPhotoFromDatabase)
  90.             this.Photo = this.GetKullaniciPhoto();
  91.     }
  92.     public OrganizationHierarchyItem(int photoWidth = 64, int pKullaniciID = -1, int photoHeight = 64, bool getPhotoFromDatabase = true, string pName = "")
  93.     {
  94.         this.SetDefaultValues();
  95.  
  96.         this.KullaniciID = pKullaniciID;
  97.         this.Name = pName;
  98.         this.PhotoSize = new Size(photoWidth, photoHeight);
  99.  
  100.         if (getPhotoFromDatabase)
  101.             this.Photo = this.GetKullaniciPhoto();
  102.     }
  103.     public OrganizationHierarchyItem(int pKullaniciID = -1, int photoWidth = 64, int photoHeight = 64, Image pPhoto = null, string pName = "")
  104.     {
  105.         this.SetDefaultValues();
  106.  
  107.         this.KullaniciID = pKullaniciID;
  108.         this.Photo = pPhoto;
  109.         this.PhotoSize = new Size(photoWidth, photoHeight);
  110.         this.Name = pName;
  111.     }
  112.     public OrganizationHierarchyItem(int pKullaniciID = -1, int photoWidth = 64, int photoHeight = 64, byte[] photoBuffer = null, string pName = "")
  113.     {
  114.         this.SetDefaultValues();
  115.  
  116.         this.Name = pName;
  117.         this.PhotoSize = new Size(photoWidth, photoHeight);
  118.         this.KullaniciID = pKullaniciID;
  119.         this.Photo = this.GetKullaniciPhoto(photoBuffer);
  120.     }
  121.  
  122. }

Yukarıdaki sınıf içindeki kodda gördüğünüz gibi bir sürü constructors oluşturdum. Böylece kullanıcı elindeki verileri esnek bir biçimde kullanarak nesne oluşturabilir.

OrganizationHierarchy.cs
  1. public class OrganizationHierarchy : List<OrganizationHierarchyItem>
  2. {
  3.  
  4.     public Image RootImage { get; set; }
  5.     public RadTreeView TreeViewControl { get; set; }
  6.  
  7.  
  8.     public OrganizationHierarchy()
  9.     {
  10.  
  11.     }
  12.     public OrganizationHierarchy(Image rootImage)
  13.     {
  14.  
  15.     }
  16.  
  17.  
  18.     public void LoadHierarchy(OrganizationHierarchyItem item, RadTreeNode node)
  19.     {
  20.         RadTreeNode childNode = new RadTreeNode(item.Name);
  21.         childNode.Image = item.Photo.GetThumbnailImage(item.PhotoSize.Width, item.PhotoSize.Height, new Image.GetThumbnailImageAbort(() => false), System.IntPtr.Zero); ;
  22.         childNode.Tag = item;
  23.  
  24.         if (item.SubItems != null && item.SubItems.Count > 0)
  25.         {
  26.             foreach (OrganizationHierarchyItem childItem in item.SubItems)
  27.             {
  28.                 this.LoadHierarchy(childItem, childNode);
  29.             }
  30.         }
  31.  
  32.         if (node == null)
  33.         {
  34.             if (this.TreeViewControl == null)
  35.                 throw new ObjectNotFoundException("Hiyerar?inin olu?turulmas? i?in gerekli RadTreeView kontrol? bulunamad?.");
  36.  
  37.             this.TreeViewControl.Nodes.Add(childNode);
  38.         }
  39.         else
  40.             node.Nodes.Add(childNode);
  41.     }
  42.     public void LoadHierarchy(OrganizationHierarchy hierarchy)
  43.     {
  44.         foreach (OrganizationHierarchyItem item in hierarchy)
  45.             this.LoadHierarchy(item, null);
  46.  
  47.         if (this.TreeViewControl == null)
  48.             throw new ObjectNotFoundException("Hiyerar?inin olu?turulmas? i?in gerekli RadTreeView kontrol? bulunamad?.");
  49.  
  50.         if (hierarchy.RootImage != null)
  51.             foreach (RadTreeNode rootNode in this.TreeViewControl.Nodes)
  52.                 rootNode.Image = hierarchy.RootImage;
  53.  
  54.         this.TreeViewControl.Tag = hierarchy;
  55.     }
  56.  
  57. }

OrganizationHierarchy” sınıfının miras aldığı yapıya dikkat edin. “List<OrganizationHierarchyItem>” böylece, yapı list gibi davranacaktır. Bu sınıfın örneğini(instance) oluşturduktan sonra ekleyeceğiniz her bir OrganizationHierarchyItem için belirttiğiniz “TreeViewControl” özelliğindeki treeview’a hiyerarşiyi oluşturacaktır.

image

Burada bazılarınız şunu diyebilir. Bu kadar yapı kurmaya ne gerek vardı. TreeView’a node’ları girerdik olur ve biterdi. Fakat bizim amacımız bu değil. Yani yazılımı olması gerektiği gibi yapmak var. Bir de yapmış olmak için yapmak var. Bizim ihtiyacımız olan bir Organization Hierarchy yapısını uygulamamız tarafında barındıracak yapıyı tasarlamak. Ardından bu yapıyı sadece TreeView için değil her yerde farklı amaçlar içinde kullanabilmek. Böylece istediğimiz yere bu yapıyı taşıyabiliriz. Farklı amaçlarla kullanabiliriz.

Projelerimde kurduğum gerçekten hoş yapıları paylaşmaya devam edeceğim. Şimdilik bu kadar. Gülümseme

Herkese iyi çalışmalar..