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


Yorum bırakın

Visual Studio 2015’de ReportViewer ve RDLC Report Bileşenleri Ekleme

Visual Studio 2015 ile “RDLC raporları” hazırlamak istediğinizde kurulumunuza bağlı olarak “Windows Forms Application” uygulaması geliştirirken, toolbox’da raporlama(reporting) tab’ını göremeyeceksiniz. Bunun sebebi “SQL Server Data Tools” yüklemesinin yapılmamış olmasıdır. Visual Studio 2015 ‘deTools” => “Extension & Updates”  seçeneğinin altında “Update” tab’ında “SQL Server Data Tools” yüklemesini göreceksiniz. Buradan gerekli güncellemeyi yapabilirsiniz ama bu güncelleme sonucunda da eğer “Windows Forms Application” uygulaması geliştirirken, toolbox’da raporlama(reporting) tab’ını göremiyorsanız; farklı bir yöntem daha mevcut.

Öncelikle “Denetim Masası” => “Program Ekle/Kaldır” kısmına gidiniz. Gelen listeden “Visual Studio 2015” ‘i sağ tıklayarak “Değiştir” seçeneği ile kuruluma “SQL Server Data Tools”  özelliğini seçerek “Update” işlemini yapınız. Yaklaşık 118 MB ‘lık bir yükleme sonucu kurulum tamamlandıktan sonra ilgili “toolbox” ve “Item Ekleme” kısmında ilgili nesneler görünecek ve kullanılabilecektir. İlgili adımları aşağıdaki görsellerden de takip ederek yapabilirsiniz.

reporting-in-visual-studio-1


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

Evvel zaman içinde kalbur saman içinde …

Evvel zaman içinde, kalbur saman içinde, pireler berber, develer tellâl iken ben anamın beşiğini tıngır mıngır sallar iken..

Bir önceki yazımda eskiden üniversite yıllarımda yazdığım bir programımdan bahsetmiştim. Sonrasında o programım bana yine o günleri hatırlattı ve sakladığım tozlu USB klasör rafımdaki diğer uygulamalara da bakmak istedim(en yenisi 2007 tarihli). Klasörümün adı “Nostalji Programlarım” idi. Hala da öyle tabii ki..

Tüm yazdığım programlara hızlı bir bakış attım. Gördüm ki gerçekten çok şeyler yapmışım. Tabii ki günün, zamanın getirdiği görünüm ve öğrenim aşamasında yaptığım eksikliklerimle fakat gene de şunu gördüm ki.. “Ne ekerseniz onu biçersiniz..” O zamanlar bu uygulamaları geliştirirken aslında bugünlere kendimi yetiştirmişim.

Tozlu USB Klasörümdeki nostalji programlarımdan en yenisi 2007 yılında yazılmış, en eskisi ise 2004 yılında pascal programlama dili ile geliştirdiğim siyah ekran bir “Telefon Defteri” uygulamasıdır. Şu zaman da hata veren www.programlama.com sitesinde makale olarak yayınladığım bir uygulama idi. Sitede, 1000 kere okunan yazı sayısı çok azdı. Benimde o zamanlar attığım o uygulama makalesi 1000’li rakamları geçmişti(Demek ki o zamanlar pascal ile uğraşan çok yazılımcı varmış) .

İnsanların faydalanması gerçekten bana ayrı bir haz vermişti. Sanırım o yüzden bu mesleği daha bir ayrı sevdim. Paylaşımcı olmayı da o sebeple seviyorum. Bir kimya mezunu olarak da bu günlere o sayede yazılımcı lakabı ile geldim.

Pascal programlama dilini, aslında programlamanın nasıl bir şey olduğunu öğrendiğim, benim için efsane kitabım.

efsane-pascal -kitabim

pascal-kodlama-ornegi

Ne heyecan ile almıştım. Hala hatırladıkça mutlu oluyorum. Tabii ki mavi ekranda kodlama yapıyorduk. Turbo Pascal 7.1 idi sanırım. Yanlış hatırlamıyorsam.

Kodlama ekranım yukarıdaki gibi idi. Çok hoş dimi !? Dil çıkaran gülümseme Ey gidi günler az hata aramadım o satırlarda.. Gülümseme intellisense mi !? O zamanlar hayal gibi bir şeydi. En azından benim için.. Tabii sonra pencereli uygulamalardan(winforms dediklerimniz) geliştirmek istedim. visual-basic-6.0

visual-basic-6.0-ide

Visual Basic 6.0 ‘a geçtim. Orada da baya bir uğraştıktan sonra şu an ki meşhur IDE ‘miz olan Visual Studio ‘ya geçtim ve sonrası böylece daha bir keyifli geldi. Visual Studio 2003 – 2005 – 2008 – 2010 – 2012 – 2013 şeklinde devamı geldi.

İşte tüm bu yaşanmışlıkları hatırladığım bir gün yaşadım o nostaljik tozlu usb klasöründeki uygulamalarıma baktığımda. Tek tek hepsini Visual Studio 2013’e upgrade ettim. Kısacası o tozlu usb klasörümün tozunu attım. Gülümseme

Ardından belki faydalı olur. Kullananlar olabilir. Ya da öğrencidir. Bir dersinin ödevinde kullanır. Oradan örnek alabilir, daha fazla geliştirebilir, kısacası bir şeyler öğrenebilir umudu ile GitHub – muratbaseren hesabıma aktardım.

 

Uygulamalarım

Visual Studio ile yazmış olduğum uygulamaları GitHub siteme aktardım. Daha eski olanları (VB 6.0 ile yazılmış aşağıdakilere benzer uygulamalar) koymadım.

Okumaya devam et


Yorum bırakın

2007 Yılında Yazdığım Kimya Programı

Back_to_the_future_IIEvet.. Geleceğe Dönüş kıvamında bir yazı olacağından yandaki posteri koymayı uygun gördüm. Sanıyorum ki geleceğe dönüş film serisini (1-2-3) bilmeyen yoktur. Eğer varsa da mutlaka izlemesini tavsiye edebileceğim. Efsane filmlerden biridir. Bizim de bir gün uçan bir kaykayımız olacağını düşü-nerek bahsetmek istediğim konuya geçiyorum.

Eski programları karıştırırken 2005 ve 2007 yılında yazdığım kimya programlarına rastladım. UI ara birimi olarak şu an için bile fena sayılmaz diye düşünüyorum. Tabii bunu kimya programı olduğu için ve kullanıcı kitlesi için asıl önemli olan işlevi olduğu için söylüyorum.

Programları görünce ve biraz kurcalayınca, geçmişe yolculuk gibi oldu benim için, gerçekten epeyce emek harcamıştım. Hatta hatırlıyorum da, o zamanlar bir programlama yarışması vardı. Bende yazdığım bu iki programı birleştirerek, tek program haline getirip o yarışmaya göndermeyi düşünmüştüm. Hatta dokümantasyonu ile beraber hazırlayıp son noktaya kadar gelmiştim. Fakat göndermekten vazgeçmiştim. Çünkü program tam olarak içime sinmemişti. Yani sanki basit bir uygulama olarak karşılanır diye düşünmüştüm. Sonradan göndermediğime çok kızdım. Sürekli de aklıma geldikçe “..neden göndermedim ki sanki..” deyip dururum, kendi kendime kızarım.

Analitik Kimya İşlemleri

Neyse sözü fazla uzatmadan kısaca bahsedeyim. Programlardan birinin adı, “Analitik Kimya İşlemleri” kısaca bahsetmek gerekirse, adından da anlaşılacağı gibi analitik kimya işlemlerini(hesaplamalarını) hızlıca yapabileceğim bir uygulama geliştirmiştim.

Analitik Kimya İşlemleri

  1. Standart Hata
  2. Standart Sapma
  3. Varyans
  4. Gerçek Değer
  5. % Bağıl Standart Sapma
  6. Ortalamanın Standart Hatası
  7. Ortalama

gibi hesaplamaları yapabildiğim bir uygulama geliştirdim. Sağ tarafa verileri giriyoruz. Sonrasında sol taraftan işleme tıklayıp açılan alanlara gerekli verileri girip hesapla dediğimizde tat taaaa sonuç elimizde.. Basit, güzel.. Gülümseme

Analitik Kimya İşlemleri 2

Menü’de farklı işlemlere de yer vermişim. Örneğin; makaleler eklemişim, işlemler menüsünde titrasyon hesaplama bile eklemişim.

Analitik Kimya İşlemleri 3

Uygulamayı buradan indirip, klasör içindeki Analitik Kimya İşlemleri isimli dosyayı çalıştırabilirsiniz. (Yengeç ikonlu dosya Gülümseme)

Analitik Kimya İşlemleri 4

Fakat eski zamanlarda yazıldığı bilgisayardaki bazı eksik uygulamalardan dolayı hata verebilir, durabilir. Eğer uygulama sonlanıyorsa, o zaman da “Apps” klasöründeki yüklemeleri bilgisayarınıza kurarsanız hataların çoğu giderilecek ve daha sorunsuz çalışacaktır.

 

Periyodik Cetvel 2005

Diğer uygulamada periyodik cetvel üzerine geliştirmiştim. Tabii tek yaptığı periyodik cetveli göstermek değil.

Periyodik Cetvel 2005

Seçilen element’in özelliklerinin listelenmesi.

Periyodik Cetvel 2005 1

Molekül ağırlığı hesaplamak, ki burada akıllı bir formülleme kullanmışım.

Periyodik Cetvel 2005 2

Sol üst menü’de “Atom yarıçapları” , “Elektronegatiflik tablosu” ve “Alternatif Periyodik Cetvel” bilgilerine de yer vermişim.

Periyodik Cetvel 2005 3

Bunlar gibi birkaç özellik daha var. Eğer programı kullanırsanız görebilirsiniz. Dilerseniz buradan indirip kullanabilirsiniz. Eğer sorun yaşarsanız önceki uygulamayı indirip “Apps” klasöründeki programları kurabilirsiniz.

 

Bunlar gibi bir dizi uygulama geliştirmişim. Her gün bir adet nostaljik programlarımdan sizlerle paylaşacağım. Belki işinize yarar. Öğrenci olabilirsiniz ödeviniz için kullanabilirsiniz. İş amaçlı kullanabilirsiniz. İsteyenlerle kodları da paylaşabilirim.

Her ne kadar bu programları satmak amaçlı yapmadıysam da, kendimi geliştirmem de çok işime yaradığını söyleyebilirim. Aklıma farklı farklı uygulamalar geldikçe bunları kodladığım, gece 04:00 ‘lere kadar kod yazdığım günlerden sevgilerle..


Yorum bırakın

Form Üzerinde Dikdörtgen Çizmek

Form veya tüm kontrollerde dikdörtgen çizebileceğiniz bir kod örneği.

using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication7
{
    public partial class Form1 : Form
    {
        bool isMouseDown = false;
        MyCoordinat coor = new MyCoordinat();

        public Form1()
        {
            InitializeComponent();

            this.MouseDown += Form1_MouseDown;
            this.MouseUp += Form1_MouseUp;
            this.MouseMove += Form1_MouseMove;
            this.Paint += Form1_Paint;
        }

        protected void Form1_Paint(object sender, PaintEventArgs e)
        {
            MyCoordinat newCoor = new MyCoordinat();

            // Secim dikdortgeni asagiya dogru suruklenirse, 
            // X2 > X1 ya da Y2 > Y1 olur. 
            // Aksi halde tersi gecerli oldugundan, 
            // X2 ve X1 ya da Y2 ve Y1 degerleri yer degistirilir.
            if (coor.X2 > coor.X1)
            {
                newCoor.X1 = coor.X1;
                newCoor.X2 = coor.X2;
            }
            else
            {
                newCoor.X1 = coor.X2;
                newCoor.X2 = coor.X1;
            }

            if (coor.Y2 > coor.Y1)
            {
                newCoor.Y1 = coor.Y1;
                newCoor.Y2 = coor.Y2;
            }
            else
            {
                newCoor.Y1 = coor.Y2;
                newCoor.Y2 = coor.Y1;
            }

            int width = newCoor.X2 - newCoor.X1;
            int height = newCoor.Y2 - newCoor.Y1;

            // Kullanilan e.Graphics; form'a aittir. 
            // Başka bir kontrol uzerinde cizim yapilacaksa
            // o kontrole ait Graphics nesnesi olusturulur.
            // ornegin; <control>.CreateGraphics(); 
            e.Graphics.DrawRectangle(
                new Pen(new SolidBrush(Color.Black)), 
                new Rectangle(newCoor.X1, newCoor.Y1, width, height));
        }

        protected void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (this.isMouseDown)
            {
                coor.X2 = e.X;
                coor.Y2 = e.Y;

                this.Refresh();   
            }
        }

        protected void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            isMouseDown = false;
            this.Refresh();
        }

        protected void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            isMouseDown = true;

            coor.X1 = e.X;
            coor.Y1 = e.Y;
        }
    }

    public class MyCoordinat
    {
        public int X1 { get; set; }
        public int Y1 { get; set; }
        public int X2 { get; set; }
        public int Y2 { get; set; }
    }
}

image


Yorum bırakın

Fusion Chart ile Grafik Oluşturma ve Yönetme

Önceki yıllarda çekmiş olduğum bu 2 bölümlük video seri ile; Fusion Chart, grafik kontrolünü kullanarak windows forms projemize nasıl entegre edeceğimizi, XML ile grafik çiziminin nasıl yapılacağını, verilerle oynama işlemlerinin nasıl olduğunun anlatıldığı bu video ile bu konuda bilgi edinebilirsiniz.


Yorum bırakın

User Control ve XML ile Örnek Bir Çalışma

Önceki yıllarda çekmiş olduğum 5 bölümlük bu seri ile; User Control oluşturma, oluşturulan user controlleri projemizde kullanma, user controllerden XML oluşturma ve XML ile çalışma hakkında sizi tecrübe sahibi yapacak bir User Control ve XML örnek projesi video serisidir.