Herkese merhaba arkadaşlar ben Kruvazör
Bugün sizlerle C# ile dinamik form oluşturma hakkında konuşacağız.
C# programlama dilinde dinamik form oluşturma, uygulamanızın çalışma zamanında kullanıcı arayüzünü esnek bir şekilde yönetmenizi sağlar.
Öncelikle, Form sınıfından bir nesne oluşturulur ve ardından bu nesne üzerinde dinamik olarak kontrol eklemek için gerekli nesneler (örneğin buttonlar, labeller vs...) oluşturulur ve konumları belirlenir. nesnelerin özellikleri ve olayları da dinamik olarak ayarlanabilir. Bu yaklaşım uygulamanın ihtiyaçlarına uygun esnek ve özelleştirilebilir kullanıcı formları oluşturmak için kullanılır.
Örneğin yazacağınız bir masaüstü otomasyonda gelişebilecek müşteri isteklerine karşın dinamik bir form sunmak işlerinizi epey kolaylaştırır.
Genel olarak konuyu kavradığımıza göre örnek yapalım.
Senaryomuz şu şekilde:
bir firma o gün teslim aldığı ürünleri tek tek not alıyor ve dışarıya aktarmak istiyor.
Ama firmanın aldığı ürün sayısı hiç bir zaman belli olmuyor.
Yani bir gün 5 bir gün 5000 ürün gelebiliyor.
Dosyaların çıktısını almak için xml kullandım.
Formu tasarlamaya başlayalım:
1 label
1 textbox
1 button
1 flowlayoutpanel
Global alanda dinamik olarak oluşturulacak label ve txtboxların listesini tutmak adına listelerimizi tanımlayalım
Ardından button click eventine gelip kodlarımızı yazalım
Bugün sizlerle C# ile dinamik form oluşturma hakkında konuşacağız.
C# programlama dilinde dinamik form oluşturma, uygulamanızın çalışma zamanında kullanıcı arayüzünü esnek bir şekilde yönetmenizi sağlar.
Öncelikle, Form sınıfından bir nesne oluşturulur ve ardından bu nesne üzerinde dinamik olarak kontrol eklemek için gerekli nesneler (örneğin buttonlar, labeller vs...) oluşturulur ve konumları belirlenir. nesnelerin özellikleri ve olayları da dinamik olarak ayarlanabilir. Bu yaklaşım uygulamanın ihtiyaçlarına uygun esnek ve özelleştirilebilir kullanıcı formları oluşturmak için kullanılır.
Örneğin yazacağınız bir masaüstü otomasyonda gelişebilecek müşteri isteklerine karşın dinamik bir form sunmak işlerinizi epey kolaylaştırır.
Genel olarak konuyu kavradığımıza göre örnek yapalım.
Senaryomuz şu şekilde:
bir firma o gün teslim aldığı ürünleri tek tek not alıyor ve dışarıya aktarmak istiyor.
Ama firmanın aldığı ürün sayısı hiç bir zaman belli olmuyor.
Yani bir gün 5 bir gün 5000 ürün gelebiliyor.
Dosyaların çıktısını almak için xml kullandım.
Formu tasarlamaya başlayalım:
1 label
1 textbox
1 button
1 flowlayoutpanel
Global alanda dinamik olarak oluşturulacak label ve txtboxların listesini tutmak adına listelerimizi tanımlayalım
C#:
private List<TextBox> textBoxListesi = new List<TextBox>();
private List<Label> labelListesi = new List<Label>();
C#:
private void button1_Click(object sender, EventArgs e)
{
// Her bir TextBox ve Label için varsayılan uzunluk
int satirUzunlugu = 700;
int kontrolGenislik = satirUzunlugu / 5;
// Form genişliği, bir kenarda boşluk bırakmak için
int formGenislik = satirUzunlugu + 20;
// TextBox sayısını TextBox'tan al
int textBoxSayisi = Convert.ToInt16(textBox1.Text);
// FlowLayoutPanel'i temizle
flowLayoutPanel1.Controls.Clear();
// TextBox ve Label listelerini temizle
textBoxListesi.Clear();
labelListesi.Clear();
// Kalan TextBox sayısını takip etmek için değişken
int kalanTextBoxSayisi = textBoxSayisi;
// TextBox ve Label'ları oluştur ve FlowLayoutPanel'e ekle
for (int i = 0; i < textBoxSayisi; i++)
{
// Label oluştur
Label urunLabel = new Label();
urunLabel.Name = "lblUrun" + i.ToString();
urunLabel.Text = "Ürün" + (i + 1).ToString() + ":";
// TextBox oluştur
// buralarda textbox ve labellara özellikler penceresinden verdiğimiz özellikleri kod olarak veriyoruz.
TextBox yeniTextBox = new TextBox();
yeniTextBox.Name = "txtBox" + i.ToString();
yeniTextBox.Text = "";
yeniTextBox.Width = kontrolGenislik - 10;
yeniTextBox.Height = 20;
// FlowLayoutPanel'e Label ve TextBox'i ekle
flowLayoutPanel1.Controls.Add(urunLabel);
flowLayoutPanel1.Controls.Add(yeniTextBox);
// Label ve TextBox'i ilgili listelere ekle
textBoxListesi.Add(yeniTextBox);
labelListesi.Add(urunLabel);
// Kalan TextBox sayısını azalt
kalanTextBoxSayisi--;
}
// Kaydet Button'u oluştur ve FlowLayoutPanel'e ekle bu button ile xml işlemi yapacağız
Button kaydetButton = new Button();
kaydetButton.Name = "btnKaydet";
kaydetButton.Text = "Kaydet";
kaydetButton.Width = 100;
kaydetButton.Height = 30;
kaydetButton.Click += new EventHandler(KaydetButtonClick);
flowLayoutPanel1.Controls.Add(kaydetButton);
// FlowLayoutPanel'in AutoScroll özelliğini etkinleştir
flowLayoutPanel1.AutoScroll = true;
}
Kaydet buttonunun click eventine gelelim
C#:
private void KaydetButtonClick(object sender, EventArgs e)
{
// Verileri XML'e aktar
XmlDocument xmlDocument = new XmlDocument();
XmlElement rootElement = xmlDocument.CreateElement("TextBoxData");
for (int i = 0; i < textBoxListesi.Count; i++)
{
XmlElement textBoxElement = xmlDocument.CreateElement("TextBox");
textBoxElement.SetAttribute("Name", textBoxListesi[i].Name);
textBoxElement.SetAttribute("Text", textBoxListesi[i].Text);
textBoxElement.SetAttribute("UrunAdi", labelListesi[i].Text.Replace(":", "")); // ':' karakterini kaldır
rootElement.AppendChild(textBoxElement);
}
xmlDocument.AppendChild(rootElement);
// XML belgesini proje klasörüne kaydet
string xmlDosyaYolu = System.IO.Path.Combine(Application.StartupPath, "TextBoxData.xml");
xmlDocument.Save(xmlDosyaYolu);
MessageBox.Show("Veriler XML dosyasına aktarıldı. Dosya yolu: " + xmlDosyaYolu);
}
Kodların tamamı:
C#:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Xml;
namespace DynamicFormDesign
{
public partial class Form1 : Form
{
private List<TextBox> textBoxListesi = new List<TextBox>();
private List<Label> labelListesi = new List<Label>();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// Her bir TextBox ve Label için varsayılan uzunluk
int satirUzunlugu = 700;
int kontrolGenislik = satirUzunlugu / 5;
// Form genişliği, bir kenarda boşluk bırakmak için
int formGenislik = satirUzunlugu + 20;
// TextBox sayısını TextBox'tan al
int textBoxSayisi = Convert.ToInt16(textBox1.Text);
// FlowLayoutPanel'i temizle
flowLayoutPanel1.Controls.Clear();
// TextBox ve Label listelerini temizle
textBoxListesi.Clear();
labelListesi.Clear();
// Kalan TextBox sayısını takip etmek için değişken
int kalanTextBoxSayisi = textBoxSayisi;
// TextBox ve Label'ları oluştur ve FlowLayoutPanel'e ekle
for (int i = 0; i < textBoxSayisi; i++)
{
// Label oluştur
Label urunLabel = new Label();
urunLabel.Name = "lblUrun" + i.ToString();
urunLabel.Text = "Ürün" + (i + 1).ToString() + ":";
// TextBox oluştur
TextBox yeniTextBox = new TextBox();
yeniTextBox.Name = "txtBox" + i.ToString();
yeniTextBox.Text = "";
yeniTextBox.Width = kontrolGenislik - 10;
yeniTextBox.Height = 20;
// FlowLayoutPanel'e Label ve TextBox'i ekle
flowLayoutPanel1.Controls.Add(urunLabel);
flowLayoutPanel1.Controls.Add(yeniTextBox);
// Label ve TextBox'i ilgili listelere ekle
textBoxListesi.Add(yeniTextBox);
labelListesi.Add(urunLabel);
// Kalan TextBox sayısını azalt
kalanTextBoxSayisi--;
}
// Kaydet Button'u oluştur ve FlowLayoutPanel'e ekle
Button kaydetButton = new Button();
kaydetButton.Name = "btnKaydet";
kaydetButton.Text = "Kaydet";
kaydetButton.Width = 100;
kaydetButton.Height = 30;
kaydetButton.Click += new EventHandler(KaydetButtonClick);
flowLayoutPanel1.Controls.Add(kaydetButton);
// FlowLayoutPanel'in AutoScroll özelliğini etkinleştir
flowLayoutPanel1.AutoScroll = true;
}
private void KaydetButtonClick(object sender, EventArgs e)
{
// Verileri XML'e aktar
XmlDocument xmlDocument = new XmlDocument();
XmlElement rootElement = xmlDocument.CreateElement("TextBoxData");
for (int i = 0; i < textBoxListesi.Count; i++)
{
XmlElement textBoxElement = xmlDocument.CreateElement("TextBox");
textBoxElement.SetAttribute("Name", textBoxListesi[i].Name);
textBoxElement.SetAttribute("Text", textBoxListesi[i].Text);
textBoxElement.SetAttribute("UrunAdi", labelListesi[i].Text.Replace(":", "")); // ':' karakterini kaldır
rootElement.AppendChild(textBoxElement);
}
xmlDocument.AppendChild(rootElement);
// XML belgesini proje klasörüne kaydet
string xmlDosyaYolu = System.IO.Path.Combine(Application.StartupPath, "TextBoxData.xml");
xmlDocument.Save(xmlDosyaYolu);
MessageBox.Show("Veriler XML dosyasına aktarıldı. Dosya yolu: " + xmlDosyaYolu);
}
}
}
OKUDUĞUNUZ İÇİN TEŞEKKÜRLER