Dynamisch Objekte erzeugen mit C#

Microsoft Visual C# 2010 Express hat in seiner Komponentensammlung ein sehr nettes Objekt dabei, nämlich das FlowLayoutPanel. Dieses Objekt vermisst man bisher leider bei Lazarus und so musste ich mich auch erst einige Stunden damit beschäftigen, wie man das gute Stück am besten nutzt. Herausgekommen ist der folgende Beispielquelltext, der in einem FlowLayoutPanel mittels ToolStripButtons dynamisch Objekte vom Typ GroupBox anlegen kann. Damit die GroupBoxen nicht so leer sind, habe ich auch noch je zwei CheckBoxLists eingefügt. Leider gibt es diese in Visual C# nicht wie unter Lazarus mit farblich frei definierbaren Zeilen, aber auch so sind die ganz nett. Der Code zeigt beispielhaft, wie man in C# Objekte anlegt und wieder löscht. Für den Einstieg am leichtesten nachvollziehbar sind die beiden oberen Routinen CreateBox und DestroyBox - also dann viel Spaß damit!

Voraussetzung für den Code:

  • Visual C# (getestet mit Version 2010 Express)
  • 1x leere Forms-Anwendung mit Event-Funktionen auf SizeChanged und auf Load; außerdem sollte MinimumSize geistreich gesetzt werden, z.B. auf 600;550, Size habe ich auf 629; 558
  • 1x FlowLayoutPanel (Standardname mit Nummer 1, bei mir Location 13; 28 und Size 588; 480)
  • 1x ToolStrip (auch Standardname mit der 1 hinten dran)

Nachdem das erledigt ist, muss das noch fast leere Projekt einfach durch den unten stehenden C#-Quelltext ersetzt werden.

So und hier der Code:

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 WindowsFormsApplication1 {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
        }
 
        private const int maxBoxes = 5;    // amount of GroupBoxes and Buttons
        private GroupBox[] GrBox            = new GroupBox[maxBoxes];
        private CheckedListBox[] ChLBox     = new CheckedListBox[2 * maxBoxes];
        private ToolStripButton[] ToolBtn   = new ToolStripButton[maxBoxes+1];    // +1 because of the "all"-box
 
        private void Form1_Load(object sender, EventArgs e) {
            CreateToolBtn(sender, e);
        }
 
        private void CreateBox(object sender, EventArgs e, int i) {
            if ((GrBox[i] == null)&&(i<=maxBoxes)) {
                GrBox[i] = new GroupBox();
                GrBox[i].Text = "GB" + (i+1).ToString();
                GrBox[i].Size = new Size(158, 152);
                flowLayoutPanel1.Controls.Add(GrBox[i]);
 
                ChLBox[2 * i] = new CheckedListBox();
                ChLBox[2 * i].BackColor = Color.FromName("Control");
                ChLBox[2 * i].Size = new Size(69, 124);
                ChLBox[2 * i].Location = new Point(7, 20);
                ChLBox[2 * i].CheckOnClick = true;
                ChLBox[2 * i].Items.Add("Text01");
                ChLBox[2 * i].Items.Add("Text02");
                ChLBox[2 * i].Items.Add("Text03");
                ChLBox[2 * i].Items.Add("Text04");
                ChLBox[2 * i].Items.Add("Text05");
                ChLBox[2 * i].Items.Add("Text06");
                ChLBox[2 * i].Items.Add("Text07");
                ChLBox[2 * i].Items.Add("Text08");
                GrBox[i].Controls.Add(ChLBox[2 * i]);
 
                ChLBox[2 * i + 1] = new CheckedListBox();
                ChLBox[2 * i + 1].Name = "GB" + (2 * i + 1).ToString();
                ChLBox[2 * i + 1].BackColor = Color.FromName("Control");
                ChLBox[2 * i + 1].Size = new Size(69, 124);
                ChLBox[2 * i + 1].Location = new Point(82, 20);
                ChLBox[2 * i + 1].CheckOnClick = true;
                ChLBox[2 * i + 1].Items.Add("Text09");
                ChLBox[2 * i + 1].Items.Add("Text10");
                ChLBox[2 * i + 1].Items.Add("Text11");
                ChLBox[2 * i + 1].Items.Add("Text12");
                ChLBox[2 * i + 1].Items.Add("Text13");
                ChLBox[2 * i + 1].Items.Add("Text14");
                ChLBox[2 * i + 1].Items.Add("Text15");
                ChLBox[2 * i + 1].Items.Add("Text16");
                GrBox[i].Controls.Add(ChLBox[2 * i + 1]);
            }
        }
 
        private void DestroyBox(object sender, EventArgs e, int i) {
            if ((GrBox[i] != null) && (i <= maxBoxes)) {
                flowLayoutPanel1.Controls.Remove(GrBox[i]);
                GrBox[i] = null;
            }
        }
 
        private void CreateToolBtn(object sender, EventArgs e) {
            int i;
            for(i=0;i < maxBoxes;i++) if (ToolBtn[i] == null) {
                ToolBtn[i] = new ToolStripButton();
                ToolBtn[i].Text = (i+1).ToString();
                ToolBtn[i].Click += ToolBtn_Click;
                toolStrip1.Items.Add(ToolBtn[i]);
             }
            ToolBtn[maxBoxes] = new ToolStripButton();
            ToolBtn[maxBoxes].Text = "All";
            ToolBtn[i].Click += ToolBtn_Click;
            toolStrip1.Items.Add(ToolBtn[maxBoxes]);
        }
 
        private void ToolBtn_Click(object sender, EventArgs e) {
            ToolStripButton ClickedToolBtn = (ToolStripButton)sender;
            int i;
            if (ClickedToolBtn.Text == "All") {                             // all boxes at once
                if (ClickedToolBtn.BackColor == Color.FromName("Control")) {
                    ClickedToolBtn.BackColor = Color.Green;
                    for (i = 0; i < maxBoxes; i++) {
                        ToolBtn[i].BackColor = Color.Green;
                        CreateBox(sender, e, i);
                    }
                } else {
                    ClickedToolBtn.BackColor = Color.FromName("Control");
                    for (i = 0; i < maxBoxes; i++) {
                        ToolBtn[i].BackColor = Color.FromName("Control");
                        DestroyBox(sender, e, i);
                    }
                }
            } else {                                                        // a single box
                i = Convert.ToInt32(ClickedToolBtn.Text) - 1;
                if (ToolBtn[i].BackColor == Color.FromName("Control")) {    // create Box
                    ToolBtn[i].BackColor = Color.Green;
                    CreateBox(sender, e, i);
                } else {                                                    // remove Box
                    ToolBtn[i].BackColor = Color.FromName("Control");
                    DestroyBox(sender, e, i);
                }
            }
        }
 
        private void Form1_SizeChanged(object sender, EventArgs e) {
            flowLayoutPanel1.Size = new Size(this.Size.Width - 41, this.Size.Height - 78);
        }
    }
}

2 Reaktionen zu “Dynamisch Objekte erzeugen mit C#”

  1. Proggi

    kannst du bitte die Quellcodes hochladen bitte?
    thx in adv.

  2. admin

    Der Code ist doch im Artikel enthalten und “alles” was Du noch benötigst, steht auch oben: die Forms-Anwendung und ganze zwei Objekte.

Einen Kommentar schreiben