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.

Reklamlar

C# – Quick Cut-Copy-Paste For Textboxes (Hızlı Kes-Kopyala-Yapıştır)

Her uygulama için olmazsa olmazlardan biri hatta üç’ü Kes-Kopyala-Yapıştır işlemleridir. Kullanıcılar gerek metin kutuları üzerinde gerekse uygulamadan dışarıya bir çok Kes-Kopyala-Yapıştır işlemi yaparlar. Tabii en azından ben yapıldığını düşünüyorum. Bir yazılım geliştirici olarak da en çok sıkılarak yaptığım işlerden biri bu işlemleri, yani her uygulamada olması gereken temel işlemlerin gerçekleştirilmesidir. Kes-Kopyala-Yapıştır işlemleri bunlardan biri. Aynı şekilde klavye kısayolları, tab-order işlemleri vs bunlarda benim biraz sıkılarak yaptığım işlemler..

kmb-udemy-reklam

İşte yine böyle düşündüğüm bir gün, aklıma bu işi otomatik olarak yapabilecek bir kod geliştirebilirsem bu sıkıntı süreci kolayca atlatabilirim diye düşündüm. Tabii öyle bir kod olmalı ki, oluşturduğum kullanıcı arayüzlerinde her bir metin kutusu(Textbox) için kod yazmamalıyım. Her uygulamada kullanabileceğim bir kodum olsun. Bu kodu  yaniilgili yere yapıştırayım ve arayüzdeki(Form ya da Kullanıcı kontrolü(UserControl)) tüm metin kutularını(Textbox) etkilesin. Tabii bu öyle bir şey olmalı ki görselliği de olmalı. Yani uygulamayı zenginleştirmelidir. Diye düşünerek kolları sıvadım. 🙂 Aklıma gelen ilk yapı Office 2007 ve Office 2010 ‘da bir metin seçildiğinde çıkan menü benzeri(tabii çok daha basiti :)) bir yapı oldu. Tabii benim aklıma ilk başta daha basiti Kes-Kopyala-Yapıştır işlemlerini yapan bir ScreenTip benzeri bir yapı oldu. Eğer bunu yapabilirsem daha sonrasında geliştirebilirm.

image 

Gerçekleştirmek istediğim yapı.

Bu akılda çakan şimşekler gibi aklıma gelen ilk yapı içinde 3 tane yan yana butonun bulunduğu bir kullanıcı kontrolü(UserControl) oldu. Bu 3 buton sırası ile Kes-Kopyala-Yapıştır işlemlerini yapacak olan butonlardı. Form üzerinde odaklanılmış(Focus olunmuş) metin kutusunun üstünde görünür hale gelecek ve kullanıcının istediği işlemi yerine getirecekti. Odaklanılmış metin kutusundan başka bir kontrol’e(herhangi bir kontrol) odaklanıldığında bu Kes-Kopyala-Yapıştır işlemini yapan kullanıcı kontrolü(UserControl), metin kutusun üzerinden kaybolacaktı.

Visual Studio 2010 üzerinde hemen bir Windows Application uygulaması açtım ve bir kullanıcı kontrolü(UserControl) oluşturdum. Tabi belirtmem gereken bir nokta var. Kontrolü geliştirirken elimde Telerik RadControls vardı. RadControl’lerini kullandım. Fakat elinizde yoksa standart kontrolleri de kullanabilirsiniz. RadControl’leri kullandığım için benim uygulama biraz daha görsellik açısından zengin gelebilir. Neden benimki buna benzemiyor demeyin. 🙂 Tabii bu arada Telerik firmasına ait RadControllerinin nasıl bişi olduğunu merak edenler için www.telerik.com adresinden kontrolleri inceleyebilirler.

Oluşturduğum hızlı Kes-Kopyala-Yapıştır yapacak olan kullanıcı kontrolü şu şekilde oldu. Sağ tarafta dizayn aşamasındaki görüntü sol tarafta ise kontrollerin hiyerarşisini görebilirsiniz.. 3 buton koyarak sol’dakinin Dock özelliğini “Left”, sağdakinin Dock özelliğini “Right” ve ortadakinin Dock özelliğini “Fill” olarak ayarlamanız. 3 butonun da DisplayStyle özelliğini “Image” olarak ayarlayın ve her birine birer resim ekleyerek ImageAligment özelliğini “MiddleCenter” olarak ayarlayınız. Ben bu ayarları tercih ettim tabii isteğe göre, daha fazla buton ya da butonların resim ile beraber yazı içermeside sağlanabilir.

Quick CutCopyPaste User Control

Hızlı Kes-Kopyala-Yapıştır kullanıcı kontrolü.

Tabii bu kullanıcı kontrolünü(UserControl) kullanacağımız bir Form oluşturdum. Bu form detaylarıda aşağıdadır.

image

Kullanıcı kontrolünün kullanılacağı Form.

Uygulamamız çalıştığında otomatik olarak metin kutularının üzerinde kullanıcı kontrolünün oluşturulmasını sağlayacağız.

image

Hızlı Kes-Kopyala-Yapıştır özelliğinin uygulanmış hali.

Burada birkaç zorluğu belirtmek istiyorum. Oluşturduğumuz kullanıcı kontrolü(UserControl) yukarıdaki form’daki metin kutularının sol üst köşelerinde belirmelidir. Fakat şöyle bir durum söz konusu, kullanıcı kontrolünün(UserControl) dizayn aşamasında sürükle-bırak yöntemi ile oluşmasını istemiyorum. Yani ben sadece metin kutuları ile ilgilenmek istiyorum. Geliştireceğim kod bu işi otomatik yapmalı. Burada karşımıza çıkan sorunlar şunlar;

1) En üstteki metin kutusunun konumu gibi bir durumda üstünde yeterli alan bulunmadığında, kullanıcı kontrolünün(UserControl) metin kutusunun altında belirmesini istiyorum. Bunu kullanıcı kontrolünün(UserControl) “Location” özelliğine uygulayacağım birkaç basit matematik işlemi ile yapabileceğime inanıyorum.

image 

1. maddedeki istenmeyen durum.

2) Kullanıcı kontrolleri uygulama çalışırken(Run-time) aşamasında oluşarak, ilgili metin kutularının üstüne ya da duruma göre altına(1.maddedeki sebepten dolayı) konumlanmalıdır. Bunuda “Location”, “Left”, “Top” özelliklerini kullanarak yapabiliriz. Fakat GroupBox, panel gibi kapsayıcı(Container) kontrollerinin içinde yer alan metin kutularının konum bilgileri(“Location”, ”Left”, ”Top”) kapsayıcı kontrolün başlangıç konumundan itibaren hesaplanmış olduğundan, bir kontrolün ekrandaki konumunu form ‘un sol köşesinden itibaren hesaplayıp veren bir metoda ihtiyacımız vardır. Bu metodu herhangi bir kontrol’de mevcuttur. İsmi, “PointToScreen” dir.

3) Bir durumda metin kutuları için oluşturulan otomatik kullanıcı kontrollerinin(UserControl) görüntülenmesi aşamasında diğer kontrollerin altında kalarak görüntülenememesidir. Bu durumum çözümüde “Form.Controls.SetChildIndex(control, 0);” şeklinde “ChildIndex” değerinin “0” olarak ayarlanmasıdır.

image

3. maddedeki istenmeyen durum.

 

ctrlCutCopyPaste.Designer.cs
namespace WindowsFormApplication1
{
partial class ctrlCutCopyPaste
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;

/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name=”disposing”>true if managed resources should be disposed; otherwise, false.
protected override void Dispose(bool disposing) {
if (disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}

#region Component Designer generated code

/// <summary>
/// Required method for Designer support – do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent() {
this.rpnlCutCopyPaste = new System.Windows.Forms.Panel();
this.rcmdCopy = new System.Windows.Forms.Button();
this.rcmdPaste = new System.Windows.Forms.Button();
this.rcmdCut = new System.Windows.Forms.Button();
this.rpnlCutCopyPaste.SuspendLayout();
this.SuspendLayout();
//
// rpnlCutCopyPaste
//
this.rpnlCutCopyPaste.Controls.Add(this.rcmdCopy);
this.rpnlCutCopyPaste.Controls.Add(this.rcmdPaste);
this.rpnlCutCopyPaste.Controls.Add(this.rcmdCut);
this.rpnlCutCopyPaste.Dock = System.Windows.Forms.DockStyle.Fill;
this.rpnlCutCopyPaste.Location = new System.Drawing.Point(0, 0);
this.rpnlCutCopyPaste.Name = “rpnlCutCopyPaste”;
this.rpnlCutCopyPaste.Size = new System.Drawing.Size(72, 20);
this.rpnlCutCopyPaste.TabIndex = 0;
//
// rcmdCopy
//
this.rcmdCopy.Dock = System.Windows.Forms.DockStyle.Fill;
this.rcmdCopy.Image = global::WindowsFormApplication1.Properties.Resources.editcopy_16;
this.rcmdCopy.Location = new System.Drawing.Point(24, 0);
this.rcmdCopy.Name = “rcmdCopy”;
this.rcmdCopy.Size = new System.Drawing.Size(24, 20);
this.rcmdCopy.TabIndex = 2;
this.rcmdCopy.Text = “Kopyala / Copy”;
//
// rcmdPaste
//
this.rcmdPaste.Dock = System.Windows.Forms.DockStyle.Right;
this.rcmdPaste.Image = global::WindowsFormApplication1.Properties.Resources.editpaste_16;
this.rcmdPaste.Location = new System.Drawing.Point(48, 0);
this.rcmdPaste.Name = “rcmdPaste”;
this.rcmdPaste.Size = new System.Drawing.Size(24, 20);
this.rcmdPaste.TabIndex = 1;
this.rcmdPaste.Text = “Yap??t?r / Paste”;
//
// rcmdCut
//
this.rcmdCut.Dock = System.Windows.Forms.DockStyle.Left;
this.rcmdCut.Image = global::WindowsFormApplication1.Properties.Resources.editcut_16;
this.rcmdCut.Location = new System.Drawing.Point(0, 0);
this.rcmdCut.Name = “rcmdCut”;
this.rcmdCut.Size = new System.Drawing.Size(24, 20);
this.rcmdCut.TabIndex = 0;
this.rcmdCut.Text = “Kes / Cut”;
//
// ctrlCutCopyPaste
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.rpnlCutCopyPaste);
this.Name = “ctrlCutCopyPaste”;
this.Size = new System.Drawing.Size(72, 20);
this.rpnlCutCopyPaste.ResumeLayout(false);
this.ResumeLayout(false);

}

#endregion

public System.Windows.Forms.Panel rpnlCutCopyPaste;
public System.Windows.Forms.Button rcmdCopy;
public System.Windows.Forms.Button rcmdPaste;
public System.Windows.Forms.Button rcmdCut;
}
}

 

ctrlCutCopyPaste.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormApplication1
{
public partial class ctrlCutCopyPaste : UserControl
{

#region Events

public event EventHandler ButtonClicked;

#endregion

#region Properties

public TextBox CurrentTextBox { get; set; }

#endregion

#region Constructors

public ctrlCutCopyPaste(TextBox txtBox) {
InitializeComponent();

this.Visible = false;
this.CurrentTextBox = txtBox;

this.SetQuickCutCopyPasteControlLocation();

txtBox.Click += new EventHandler(txtBoxItem_Click);
txtBox.GotFocus += new EventHandler(txtBoxItem_GotFocus);
txtBox.LostFocus += new EventHandler(txtBoxItem_LostFocus);

this.rcmdCut.Click += new EventHandler(rcmdCut_Click);
this.rcmdCopy.Click += new EventHandler(rcmdCopy_Click);
this.rcmdPaste.Click += new EventHandler(rcmdPaste_Click);

// Form boyutu de?i?tirildi?inde quick kontrol g?r?nmez yap?l?r.
this.CurrentTextBox.FindForm().ResizeBegin += new EventHandler(ctrlCutCopyPaste_ResizeBegin);
}

#endregion

#region Private Methods

private void SetQuickCutCopyPasteControlLocation() {
// Kontrol?n ait oldu?u form’u bulur.
Form controlForm = this.CurrentTextBox.FindForm();

controlForm.Controls.Add(this);

// Textbox kontrol?n?n form ?zerindeki konumunu verir.
Point locationOnForm = controlForm.PointToClient(
this.CurrentTextBox.Parent.PointToScreen(this.CurrentTextBox.Location));

// Kes-Kopyala-Yap??t?r kontrol?n?n konumu hesaplan?r.
int x = locationOnForm.X;
int y = (locationOnForm.Y – this.Height < 0) ? locationOnForm.Y + this.CurrentTextBox.Height : locationOnForm.Y – this.Height;
this.Location = new Point(x, y);

// T?m kontrolleri ?zerinde g?r?nmesi i?in kes-kopyala-yap??t?r kontrol?n?n
// form ?zerinde ilk alt index olmas? sa?lan?r.
controlForm.Controls.SetChildIndex(this, 0);
}

#endregion

#region Event Handlers

protected void RaiseButtonClickedEvent() {
if (this.ButtonClicked != null)
this.ButtonClicked(this, null);

this.CurrentTextBox.FindForm().Focus();

if (this.CurrentTextBox != null)
this.CurrentTextBox.Focus();
}
protected void ctrlCutCopyPaste_ResizeBegin(object sender, EventArgs e) {
this.Visible = false;
}

protected void rcmdCut_Click(object sender, EventArgs e) {
if (this.CurrentTextBox != null)
this.CurrentTextBox.Cut();

this.RaiseButtonClickedEvent();
}
protected void rcmdCopy_Click(object sender, EventArgs e) {
if (this.CurrentTextBox != null)
this.CurrentTextBox.Copy();

this.RaiseButtonClickedEvent();
}
protected void rcmdPaste_Click(object sender, EventArgs e) {
if (this.CurrentTextBox != null)
this.CurrentTextBox.Paste();

this.RaiseButtonClickedEvent();
}
protected void txtBoxItem_Click(object sender, EventArgs e) {
// Form boyutu de?i?tirilmi? olabilece?i i?in quick CutCopyPaste kontrol? konumu tekrar hesaplan?r.
this.SetQuickCutCopyPasteControlLocation();

this.Visible = true;
}
protected void txtBoxItem_GotFocus(object sender, EventArgs e) {
// Form boyutu de?i?tirilmi? olabilece?i i?in quick CutCopyPaste kontrol? konumu tekrar hesaplan?r.
this.SetQuickCutCopyPasteControlLocation();

this.Visible = true;
}
protected void txtBoxItem_LostFocus(object sender, EventArgs e) {
this.Visible = false;
}

#endregion

}
}

 

Form1.Designer.cs
namespace WindowsFormApplication1
{
partial class Form1
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;

/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name=”disposing”>true if managed resources should be disposed; otherwise, false.
protected override void Dispose(bool disposing) {
if (disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}

#region Windows Form Designer generated code

/// <summary>
/// Required method for Designer support – do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent() {
this.radTextBox1 = new System.Windows.Forms.TextBox();
this.radTextBox2 = new System.Windows.Forms.TextBox();
this.radTextBox3 = new System.Windows.Forms.TextBox();
this.listBox1 = new System.Windows.Forms.ListBox();
this.panel1 = new System.Windows.Forms.Panel();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.panel1.SuspendLayout();
this.groupBox1.SuspendLayout();
this.SuspendLayout();
//
// radTextBox1
//
this.radTextBox1.AcceptsReturn = true;
this.radTextBox1.AcceptsTab = true;
this.radTextBox1.Location = new System.Drawing.Point(38, 15);
this.radTextBox1.Name = “radTextBox1”;
this.radTextBox1.ReadOnly = true;
this.radTextBox1.Size = new System.Drawing.Size(100, 20);
this.radTextBox1.TabIndex = 0;
this.radTextBox1.Text = “radTextBox1”;
//
// radTextBox2
//
this.radTextBox2.AcceptsReturn = true;
this.radTextBox2.AcceptsTab = true;
this.radTextBox2.Location = new System.Drawing.Point(264, 8);
this.radTextBox2.Name = “radTextBox2”;
this.radTextBox2.Size = new System.Drawing.Size(140, 20);
this.radTextBox2.TabIndex = 0;
this.radTextBox2.Text = “radTextBox1”;
//
// radTextBox3
//
this.radTextBox3.AcceptsReturn = true;
this.radTextBox3.AcceptsTab = true;
this.radTextBox3.Location = new System.Drawing.Point(167, 12);
this.radTextBox3.Name = “radTextBox3”;
this.radTextBox3.Size = new System.Drawing.Size(100, 20);
this.radTextBox3.TabIndex = 0;
this.radTextBox3.Text = “radTextBox1”;
//
// listBox1
//
this.listBox1.FormattingEnabled = true;
this.listBox1.Location = new System.Drawing.Point(325, 6);
this.listBox1.Name = “listBox1”;
this.listBox1.Size = new System.Drawing.Size(97, 290);
this.listBox1.TabIndex = 1;
//
// panel1
//
this.panel1.Controls.Add(this.radTextBox2);
this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.panel1.Location = new System.Drawing.Point(0, 209);
this.panel1.Name = “panel1”;
this.panel1.Size = new System.Drawing.Size(443, 99);
this.panel1.TabIndex = 3;
//
// groupBox1
//
this.groupBox1.Controls.Add(this.radTextBox1);
this.groupBox1.Location = new System.Drawing.Point(67, 88);
this.groupBox1.Name = “groupBox1”;
this.groupBox1.Size = new System.Drawing.Size(200, 100);
this.groupBox1.TabIndex = 2;
this.groupBox1.TabStop = false;
this.groupBox1.Text = “groupBox1”;
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(443, 308);
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.panel1);
this.Controls.Add(this.listBox1);
this.Controls.Add(this.radTextBox3);
this.Name = “Form1”;
this.Text = “Form1”;
this.Load += new System.EventHandler(this.Form1_Load_1);
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();

}

#endregion

private System.Windows.Forms.TextBox radTextBox1;
private System.Windows.Forms.TextBox radTextBox2;
private System.Windows.Forms.TextBox radTextBox3;
private System.Windows.Forms.ListBox listBox1;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.GroupBox groupBox1;
}
}


Form1.cs
using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace WindowsFormApplication1

{

public partial class Form1 : Form

{

public Form1() {

InitializeComponent();

}

/// <summary>

/// Container kontrol?n?n i?erdi?i kontrol listesini verir.

/// </summary>

/// <param name=”container”>Kapsay?c? kontrol.

/// <param name=”list”>Kontrol listesi.

private void AddSubControlsToList(Control container, List<control> list) {

if (container.Controls != null)

foreach (Control c in container.Controls) {

list.Add(c);

AddSubControlsToList(c, list);

}

}

/// <summary>

/// Container kontrol?n?n i?erdi?i belirtilen tipteki kontrol listesini verir.

/// </summary>

/// <param name=”container”>Kapsay?c? kontrol.

/// <param name=”list”>Kontrol listesi.

/// <param name=”type”>Elde edilmek istenilen kontrol listesi.

private void AddSubControlsToList(Control container, List<control> list, Type type) {

if (container.Controls != null)

foreach (Control c in container.Controls) {

// E?er belirtilen tipte ise..

if (c.GetType() == type)

list.Add(c);

AddSubControlsToList(c, list);

}

}

/// <summary>

/// Kontrol listesindeki kontrollere Kes-Kopyala-Yap??t?r i?lemini ger?ekle?tirecek olan kontrol? ekler.

/// </summary>

/// <param name=”controlList”>Kontrol Listesi.

private void SetCutCopyPasteControl(List<control> controlList) {

foreach (Control ctrl in controlList) {

TextBox txtBox = ctrl as TextBox;

if (txtBox != null) {

ctrlCutCopyPaste cutCopyPasteControl = new ctrlCutCopyPaste(txtBox);

}

}

}

private void Form1_Load_1(object sender, EventArgs e) {

// Kontrol listesini tutacak nesne olu?turulur.

List<control> controlList = new List<control>();

// RadTextBox tipindeki kontrollerin listesi elde edilir.

this.AddSubControlsToList(this, controlList, typeof(TextBox));

// Kes-Kopyala-Yap??t?r i?lemini ger?ekle?tirecek olan kontrol, kontrol listesindeki

// kontrollere ba?lan?r.

this.SetCutCopyPasteControl(controlList);

}

}

}

Kodun içinde önemli kısımları açıklama satırları ile açıkladım. Bu kullanıcı kontrolünü(UserControl) kullanarak ve Form1.cs içindeki kodu istediğiniz form’lara yapıştırmanız yeterlidir. Bu sayede form’a eklediğiniz her metin kutusu için kullanıcı kontrolümüz(UserControl) aktifleşecektir. Uygulamamızdan birkaç ekran görüntüsü alalım. 🙂

image 

Yukarıda yeterli alan olmadığında Quick Cut-Copy-Paste kontrolünün görünmesi.

image 

Groupbox kontrolünün altında kalmadan metin kutusu üstünde görüntülenmesi.

image 

3. maddedeki hata görüldüğü gibi artık olmuyor.

C# – User Control To XML – Part – 1

Bu görsel derste;

Bir Container(Panel) içine kendi oluşturduğumuz UserControllerin Run-time ‘da dinamik olarak eklenmesini, ardından bir tıklama ile container içine eklediğimiz UserControllerin XML bir dosyaya kayedilmesini sağlayacağız. Ardından bu dosyadan okuyarak UserControlleri container içine tekrardan oluşturacağız.. Son olarak’da container içinde inşaa ettiğimiz UserControllerimizin container dışındaki bir kontrole nasıl erişbileceğini göstereceğim.

Tüm bu işlemleri yaparken, form arka planına kod yazımını en az düzeyde tutup, UserController ve container(Panel) içinde metod tanımlayarak bu kısımlarda kodu oluşturacağız. Böylece daha sade ve temiz bir kodlama ile modüler bir yapı oluşturmuş olacağız. Bu yapı sayesinde istediğimiz zaman projeye Usercontrol ekleyerek projenin daha temiz ve karmaşıklaşmadan genişlemesini sağlayacağız. Ayrıca modifikasyona açık bir yapı oluşturmuş olacağız.

3 bölüm şeklinde yayınlayacağım bu konuyu severek izleyeceğinizi umuyorum.. 🙂
3. bölümden sonraki makalemde pojenin kodunu bulabilirsiniz. Ayrıca projeyide indirebilirsiniz..

http://content.screencast.com/users/MaviSeffaf/folders/Default/media/6ce6c81f-d09c-4e40-9a0c-e9b4a21503c7/bootstrap.swf

Videoyu indir!

C# – User Control To XML – Part – 2

User Control To Xml görsel dersimizin 2. bölümünde;
Oluşturduğumuz user controlleri XML olarak kaydetmek ve XML’den okuyarak tekrar listelenmesini sağlıyor olacağız.. 1 saatlik bir video olduğu için 3 parça olarak yayınlıyorum . 🙂

http://content.screencast.com/users/MaviSeffaf/folders/Default/media/a7a0e6d3-ac64-447d-8f4e-760232cf20d1/UserControlToXml-Part2_1.avi
Videoyu indir!

http://content.screencast.com/users/MaviSeffaf/folders/Default/media/82b7435c-6399-4346-868b-4b395f2116d5/UserControlToXml-Part2_2.avi
Videoyu indir!

http://content.screencast.com/users/MaviSeffaf/folders/Default/media/f956c228-2184-4ebb-b7cb-a39250d5f178/UserControlToXml-Part2_3.avi
Videoyu indir!

C# – User Control To XML – Part – 3

UserControl To Xml Bölüm 3 görsel dersinde;
Run-time’da oluşturduğumuz UserControl’lerimizin içinde bulundukları Container Panel dışında bir kontrole erişimlerini nasıl sağladığımızı görebilirsiniz.. Mümkün oldukça Form.cs class’ına kodlama yapmadan erişim sağlamanın yöntemini geliştiriyoruz..

http://content.screencast.com/users/MaviSeffaf/folders/Default/media/3ddfadd9-ecc0-46bd-a6b5-402c0d6f53be/bootstrap.swf

Videoyu indir!

Proje dosyası :
UserControlToXml.rar

C# – User Control To XML – Kodu

UserControl To XML isimli Part – 1 , Part – 2 , Part – 3 bölümlerindeki projenin kodlarını aşağıda bulabilirsiniz.. Designer.cs class kodları ile beraber kullanabilirsiniz..

UserControl1.Designer.cs

UserControl1.Designer.cs


namespace UserControlsToXml.UserControls

{

    partial class UserControl1

    {

        ///

        /// Required designer variable.

        ///

        private System.ComponentModel.IContainer components = null;

 

        ///

        /// Clean up any resources being used.

        ///

        /// true if managed resources should be disposed; otherwise, false.

        protected override void Dispose(bool disposing)

        {

            if (disposing && (components != null))

            {

                components.Dispose();

            }

            base.Dispose(disposing);

        }

 

        #region Component Designer generated code

 

        ///

        /// Required method for Designer support - do not modify

        /// the contents of this method with the code editor.

        ///

        private void InitializeComponent()

        {

            this.button1 = new System.Windows.Forms.Button();

            this.label1 = new System.Windows.Forms.Label();

            this.textBox1 = new System.Windows.Forms.TextBox();

            this.SuspendLayout();

            //

            // button1

            //

            this.button1.Dock = System.Windows.Forms.DockStyle.Right;

            this.button1.Location = new System.Drawing.Point(301, 0);

            this.button1.Name = "button1";

            this.button1.Size = new System.Drawing.Size(75, 20);

            this.button1.TabIndex = 0;

            this.button1.Text = "button1";

            this.button1.UseVisualStyleBackColor = true;

            this.button1.Click += new System.EventHandler(this.button1_Click);

            //

            // label1

            //

            this.label1.Dock = System.Windows.Forms.DockStyle.Left;

            this.label1.Location = new System.Drawing.Point(0, 0);

            this.label1.Name = "label1";

            this.label1.Padding = new System.Windows.Forms.Padding(5, 0, 0, 0);

            this.label1.Size = new System.Drawing.Size(109, 20);

            this.label1.TabIndex = 1;

            this.label1.Text = "label1";

            this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;

            //

            // textBox1

            //

            this.textBox1.Dock = System.Windows.Forms.DockStyle.Fill;

            this.textBox1.Location = new System.Drawing.Point(109, 0);

            this.textBox1.Name = "textBox1";

            this.textBox1.Size = new System.Drawing.Size(192, 20);

            this.textBox1.TabIndex = 2;

            //

            // UserControl1

            //

            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);

            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

            this.Controls.Add(this.textBox1);

            this.Controls.Add(this.label1);

            this.Controls.Add(this.button1);

            this.Name = "UserControl1";

            this.Size = new System.Drawing.Size(376, 20);

            this.ResumeLayout(false);

            this.PerformLayout();

 

        }

 

        #endregion

 

        public System.Windows.Forms.Button button1;

        public System.Windows.Forms.Label label1;

        public System.Windows.Forms.TextBox textBox1;

 

    }

}


UserControl1.cs


using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Drawing;

using System.Data;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Xml.Linq;

 

namespace UserControlsToXml.UserControls

{

    public partial class UserControl1 : UserControl, IMyUserControl

    {

        private Random rnd = new Random();

        private ComboBox _MyCombobox = null;

 

        public UserControl1()

        {

            InitializeComponent();

 

            this.label1.Text = "Label-" + rnd.Next(0, 100).ToString();

            this.textBox1.Text = "Textbox-" + rnd.Next(0, 100).ToString();

            this.button1.Text = "Button-" + rnd.Next(0, 100).ToString();

        }

        private void button1_Click(object sender, EventArgs e)

        {

            MessageBox.Show(this.textBox1.Text);

        }

        private void _MyCombobox_SelectedIndexChanged(object sender, EventArgs e)

        {

            if (this.MyCombobox.SelectedItem != null)

                this.textBox1.Text = this.MyCombobox.SelectedItem.ToString();

        }

 

        #region IMyUserControl Members

 

        public System.Xml.Linq.XElement GetXml()

        {

            XElement xe = new XElement("control",

                new XAttribute("label", this.label1.Text),

                new XAttribute("textbox", this.textBox1.Text),

                new XAttribute("button", this.button1.Text),

                new XAttribute("type", this.GetType().ToString()));

 

            return xe;

        }

        public Control GetControlInstance(XElement xe)

        {

            string labelStr = xe.Attribute("label").Value;

            string textboxStr = xe.Attribute("textbox").Value;

            string buttonStr = xe.Attribute("button").Value;

 

            this.label1.Text = labelStr;

            this.textBox1.Text = textboxStr;

            this.button1.Text = buttonStr;

 

            return this;

        }

        public ComboBox MyCombobox

        {

            get

            {

                return this._MyCombobox;

            }

            set

            {

                this._MyCombobox = value;

 

                if(this._MyCombobox != null)

                    this._MyCombobox.SelectedIndexChanged += new EventHandler(_MyCombobox_SelectedIndexChanged);

            }

        }

 

        #endregion

    }

}


UserControl2.Designer.cs


namespace UserControlsToXml.UserControls

{

    partial class UserControl2

    {

        ///

        /// Required designer variable.

        ///

        private System.ComponentModel.IContainer components = null;

 

        ///

        /// Clean up any resources being used.

        ///

        /// true if managed resources should be disposed; otherwise, false.

        protected override void Dispose(bool disposing)

        {

            if (disposing && (components != null))

            {

                components.Dispose();

            }

            base.Dispose(disposing);

        }

 

        #region Component Designer generated code

 

        ///

        /// Required method for Designer support - do not modify

        /// the contents of this method with the code editor.

        ///

        private void InitializeComponent()

        {

            this.label1 = new System.Windows.Forms.Label();

            this.button1 = new System.Windows.Forms.Button();

            this.SuspendLayout();

            //

            // label1

            //

            this.label1.Dock = System.Windows.Forms.DockStyle.Fill;

            this.label1.Location = new System.Drawing.Point(0, 0);

            this.label1.Name = "label1";

            this.label1.Padding = new System.Windows.Forms.Padding(5, 0, 0, 0);

            this.label1.Size = new System.Drawing.Size(301, 20);

            this.label1.TabIndex = 4;

            this.label1.Text = "label1";

            this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;

            //

            // button1

            //

            this.button1.Dock = System.Windows.Forms.DockStyle.Right;

            this.button1.Location = new System.Drawing.Point(301, 0);

            this.button1.Name = "button1";

            this.button1.Size = new System.Drawing.Size(75, 20);

            this.button1.TabIndex = 3;

            this.button1.Text = "button1";

            this.button1.UseVisualStyleBackColor = true;

            this.button1.Click += new System.EventHandler(this.button1_Click);

            //

            // UserControl2

            //

            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);

            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

            this.Controls.Add(this.label1);

            this.Controls.Add(this.button1);

            this.Name = "UserControl2";

            this.Size = new System.Drawing.Size(376, 20);

            this.ResumeLayout(false);

 

        }

 

        #endregion

 

        public System.Windows.Forms.Label label1;

        public System.Windows.Forms.Button button1;

 

    }

}


UserControl2.cs


using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Drawing;

using System.Data;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Xml.Linq;

 

namespace UserControlsToXml.UserControls

{

    public partial class UserControl2 : UserControl, IMyUserControl

    {

        private Random rnd = new Random();

        private ComboBox _MyCombobox = null;

 

        public UserControl2()

        {

            InitializeComponent();

 

            this.label1.Text = "Label-" + rnd.Next(0, 100).ToString();

            this.button1.Text = "Button-" + rnd.Next(0, 100).ToString();

        }

        private void button1_Click(object sender, EventArgs e)

        {

            MessageBox.Show(this.label1.Text);

        }

        private void _MyCombobox_SelectedIndexChanged(object sender, EventArgs e)

        {

            if (this.MyCombobox.SelectedItem != null)

                this.label1.Text = this.MyCombobox.SelectedItem.ToString();

        }

 

 

        #region IMyUserControl Members

 

        public System.Xml.Linq.XElement GetXml()

        {

            XElement xe = new XElement("control",

                 new XAttribute("label", this.label1.Text),

                 new XAttribute("button", this.button1.Text),

                 new XAttribute("type", this.GetType().ToString()));

 

            return xe;

        }

        public Control GetControlInstance(XElement xe)

        {

            UserControl2 uc2 = new UserControl2();

 

            string labelStr = xe.Attribute("label").Value;

            string buttonStr = xe.Attribute("button").Value;

 

            uc2.label1.Text = labelStr;

            uc2.button1.Text = buttonStr;

 

            return uc2;

        }

        public ComboBox MyCombobox

        {

            get

            {

                return this._MyCombobox;

            }

            set

            {

                this._MyCombobox = value;

 

                if (this._MyCombobox != null)

                    this._MyCombobox.SelectedIndexChanged += new EventHandler(_MyCombobox_SelectedIndexChanged);

            }

        }

 

        #endregion

    }

}


MyContainerPanel.cs


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Xml.Linq;

 

namespace UserControlsToXml

{

    public class MyContainerPanel : System.Windows.Forms.Panel

    {

        private int y = 0;

        //public ComboBox CMB { get; set; }

 

 

        private object CreateObjectInstance(string typeName)

        {

            Type typ = Type.GetType(typeName);

            object obj = Activator.CreateInstance(typ);

 

            //Form'daki combobox nesnesi oluşturulan UserControl'e bağlanır..

            //((IMyUserControl)obj).MyCombobox = this.CMB;

 

            return obj;

        }

 

 

        public void AddMyUserControlToPanel(string typeName)

        {

            object obj = this.CreateObjectInstance(typeName);

            Control ctrl = (Control)obj;

 

            this.AddControlToPanel(ctrl);

        }

        public void AddControlToPanel(Control ctrl)

        {

            if (ctrl != null)

            {

                ctrl.Top = y;

                this.Controls.Add(ctrl);

                y += 20;

            }

        }

 

 

        public void CreateControlXmlFile(string path)

        {

            XDocument xDoc = new XDocument(

                    new XDeclaration("1.0", "ISO-8859-9", null));

 

            XElement root = new XElement("controls");

 

            foreach (Control ctrl in this.Controls)

            {

                XElement xe = ((IMyUserControl)ctrl).GetXml();

                root.Add(xe);

            }

 

            xDoc.Add(root);

            xDoc.Save(path);

            xDoc = null;

        }

        public void ReadControlXmlFile(string path)

        {

            XDocument xDoc = XDocument.Load(path);

            XElement root = xDoc.Root;

 

            this.Controls.Clear();

            this.y = 0;

 

            foreach (XElement xe in root.Elements())

            {

                string typeName = xe.Attribute("type").Value;

                object obj = this.CreateObjectInstance(typeName);

 

                Control ctrl = ((IMyUserControl)obj).GetControlInstance(xe);

 

                this.AddControlToPanel(ctrl);

            }

        }

    }

}


IMyUserControl.cs


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Xml.Linq;

using System.Windows.Forms;

 

namespace UserControlsToXml

{

    public interface IMyUserControl

    {

        XElement GetXml();

        Control GetControlInstance(XElement xe);

 

        ComboBox MyCombobox { get; set; }

    }

}


Form1.Designer.cs


namespace UserControlsToXml

{

    partial class Form1

    {

        ///

        /// Required designer variable.

        ///

        private System.ComponentModel.IContainer components = null;

 

        ///

        /// Clean up any resources being used.

        ///

        /// true if managed resources should be disposed; otherwise, false.

        protected override void Dispose(bool disposing)

        {

            if (disposing && (components != null))

            {

                components.Dispose();

            }

            base.Dispose(disposing);

        }

 

        #region Windows Form Designer generated code

 

        ///

        /// Required method for Designer support - do not modify

        /// the contents of this method with the code editor.

        ///

        private void InitializeComponent()

        {

            this.splitContainer1 = new System.Windows.Forms.SplitContainer();

            this.button2 = new System.Windows.Forms.Button();

            this.button1 = new System.Windows.Forms.Button();

            this.listBox1 = new System.Windows.Forms.ListBox();

            this.myContainerPanel1 = new UserControlsToXml.MyContainerPanel();

            this.comboBox1 = new System.Windows.Forms.ComboBox();

            this.splitContainer1.Panel1.SuspendLayout();

            this.splitContainer1.Panel2.SuspendLayout();

            this.splitContainer1.SuspendLayout();

            this.SuspendLayout();

            //

            // splitContainer1

            //

            this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;

            this.splitContainer1.Location = new System.Drawing.Point(0, 0);

            this.splitContainer1.Name = "splitContainer1";

            //

            // splitContainer1.Panel1

            //

            this.splitContainer1.Panel1.Controls.Add(this.button2);

            this.splitContainer1.Panel1.Controls.Add(this.button1);

            this.splitContainer1.Panel1.Controls.Add(this.listBox1);

            //

            // splitContainer1.Panel2

            //

            this.splitContainer1.Panel2.Controls.Add(this.myContainerPanel1);

            this.splitContainer1.Panel2.Controls.Add(this.comboBox1);

            this.splitContainer1.Size = new System.Drawing.Size(570, 310);

            this.splitContainer1.SplitterDistance = 190;

            this.splitContainer1.TabIndex = 0;

            //

            // button2

            //

            this.button2.Location = new System.Drawing.Point(31, 275);

            this.button2.Name = "button2";

            this.button2.Size = new System.Drawing.Size(75, 23);

            this.button2.TabIndex = 2;

            this.button2.Text = "XML Oku";

            this.button2.UseVisualStyleBackColor = true;

            this.button2.Click += new System.EventHandler(this.button2_Click);

            //

            // button1

            //

            this.button1.Location = new System.Drawing.Point(112, 275);

            this.button1.Name = "button1";

            this.button1.Size = new System.Drawing.Size(75, 23);

            this.button1.TabIndex = 1;

            this.button1.Text = "XML Yaz";

            this.button1.UseVisualStyleBackColor = true;

            this.button1.Click += new System.EventHandler(this.button1_Click);

            //

            // listBox1

            //

            this.listBox1.Dock = System.Windows.Forms.DockStyle.Fill;

            this.listBox1.FormattingEnabled = true;

            this.listBox1.Location = new System.Drawing.Point(0, 0);

            this.listBox1.Name = "listBox1";

            this.listBox1.Size = new System.Drawing.Size(190, 303);

            this.listBox1.TabIndex = 0;

            this.listBox1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.listBox1_MouseDoubleClick);

            //

            // myContainerPanel1

            //

            this.myContainerPanel1.BackColor = System.Drawing.Color.Silver;

            this.myContainerPanel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;

            this.myContainerPanel1.Dock = System.Windows.Forms.DockStyle.Fill;

            this.myContainerPanel1.Location = new System.Drawing.Point(0, 21);

            this.myContainerPanel1.Name = "myContainerPanel1";

            this.myContainerPanel1.Size = new System.Drawing.Size(376, 289);

            this.myContainerPanel1.TabIndex = 1;

            this.myContainerPanel1.ControlAdded += new System.Windows.Forms.ControlEventHandler(this.myContainerPanel1_ControlAdded);

            //

            // comboBox1

            //

            this.comboBox1.BackColor = System.Drawing.Color.LightCoral;

            this.comboBox1.Dock = System.Windows.Forms.DockStyle.Top;

            this.comboBox1.FormattingEnabled = true;

            this.comboBox1.Items.AddRange(new object[] {

            "Test1",

            "Test2",

            "Test3"});

            this.comboBox1.Location = new System.Drawing.Point(0, 0);

            this.comboBox1.Name = "comboBox1";

            this.comboBox1.Size = new System.Drawing.Size(376, 21);

            this.comboBox1.TabIndex = 0;

            //

            // Form1

            //

            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);

            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

            this.ClientSize = new System.Drawing.Size(570, 310);

            this.Controls.Add(this.splitContainer1);

            this.Name = "Form1";

            this.Text = "Form1";

            this.Load += new System.EventHandler(this.Form1_Load);

            this.splitContainer1.Panel1.ResumeLayout(false);

            this.splitContainer1.Panel2.ResumeLayout(false);

            this.splitContainer1.ResumeLayout(false);

            this.ResumeLayout(false);

 

        }

 

        #endregion

 

        private System.Windows.Forms.SplitContainer splitContainer1;

        private System.Windows.Forms.ListBox listBox1;

        private System.Windows.Forms.Button button1;

        private System.Windows.Forms.Button button2;

        private MyContainerPanel myContainerPanel1;

        private System.Windows.Forms.ComboBox comboBox1;

    }

}

 


Form1.cs


using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Xml.Linq;

 

namespace UserControlsToXml

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

 

 

        private void Form1_Load(object sender, EventArgs e)

        {

            //this.myContainerPanel1.CMB = this.comboBox1;

 

            string[] userControlTypeList =

                new string[2]

                {

                    "UserControlsToXml.UserControls.UserControl1",

                    "UserControlsToXml.UserControls.UserControl2"

                };

 

            this.listBox1.Items.Clear();

 

            foreach (string userControlType in userControlTypeList)

            {

                this.listBox1.Items.Add(userControlType);

            }

        }

        private void listBox1_MouseDoubleClick(object sender, MouseEventArgs e)

        {

            if (this.listBox1.SelectedItem != null)

            {

                string typeName = this.listBox1.SelectedItem.ToString();

                this.myContainerPanel1.AddMyUserControlToPanel(typeName);

            }

        }

        private void button1_Click(object sender, EventArgs e)

        {

            this.myContainerPanel1.CreateControlXmlFile(Application.StartupPath + "\\" + "Test.xml");

        }

        private void button2_Click(object sender, EventArgs e)

        {

            this.myContainerPanel1.ReadControlXmlFile(Application.StartupPath + "\\" + "Test.xml");

        }

 

        private void myContainerPanel1_ControlAdded(object sender, ControlEventArgs e)

        {

            ((IMyUserControl)e.Control).MyCombobox = this.comboBox1;

        }

    }

}