Hoşgeldin Misafir

C# Dinamik Form oluşturma

bypatnos

DeepWeb
28 Haz 2024
614 Mesaj

Aktiflik

Seviye

Deneyim

TIM / GÖREV:

Merhabalar Ben @bypatnos Lojistik grup adına paylaşılan C# Dinamik Form oluşturma makalesinde sizi görmekten mutluk duyarım.

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

Kod:
 private List<TextBox> textBoxListesi = new List<TextBox>();
 private List<Label> labelListesi = new List<Label>();
Ardından button click eventine gelip kodlarımızı yazalım
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.
Kod:
  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ı:
Kod:
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);
        }
    }
}

LOJİSTİK TİM SUNDU

btn1pyf.png