C# Dynamisch Objekte wie Textboxen erzeugen?

Nick_SMI

Ensign
Registriert
Sep. 2015
Beiträge
153
Hallo zusammen!

Ich habe lange gesucht, gefunden aber nie verstanden...

Wie kann ich Objekte dynamisch erzeugen?

Bsp.: Es gibt 5 Dienste, für jeden soll eine Textbox erzeugt werden, es kann aber auch an einem anderen Tag 7 geben...!?

Wäre nett, wenn ihr mir weiterhelfen könntet!

Gruß und danke im Vorraus!
 
Spontan:

Ich würde ne Liste nutzen, in der du deine Textboxen abspeicherst. Dann eine Schleife in der du die Textbox erzeugst und in die Liste einfügst. Bei jedem Durchlauf wird die Position der Textbox entsprechend verändert.
 
Ich würde dafür eher eine TabControl empfehlen, dann wird immer gleich viel Platz verbraucht, etwas Beispielcode:

Code:
...
        private void CreateTabs() {
            this.tabControl1.Controls.Clear();

            String[] strTitle = { "Erster!", "Zwo", "Drei", "Nummer Vier", "Fünf" };
            String[] strTexts = { "Nummer one", "Zweiter", "Dritter Text", "Vier\r\n ist\r\n  hier", "Nummero fünf lebt!" };
            int n = strTitle.Length;
            TabPageText[] tba = new TabPageText[n];

            for (int i = 0; i < n; i++) {
                tba[i] = new TabPageText(strTitle[i], strTexts[i]);
                this.tabControl1.Controls.Add(tba[i]);
            }
        }
...

    public class TabPageText : TabPage {
        public TextBox tb { get; set; }
        public TabPageText(String title, String text) {
            tb = new TextBox();
            Text = title;
            tb.Dock = System.Windows.Forms.DockStyle.Fill;
            tb.Multiline = true;
            tb.Text = text;
            Controls.Add(tb);
        }
    }
 
Mit WindowsForms musst du dir in der Tat wie beschrieben deine Textboxen auf Basis deiner Dienste entsprechend selber zusammenbauen.

Aber um mal meinen Senf dazugeben zu können: Gerade bei solchen Aufgaben glänzt WPF und macht dir die Sache sehr leicht. Du hast eine Liste von Diensten und übergibst diese deinem Fenster. Dann definierst du eine Vorlage (Template), wie ein Dienst grafisch zu rendern ist, und fertig bist du. Da kannst du auch mehr als nur eine TextBox rendern. Zum Beispiel einen farbigen Kreis, der anzeigt, ob dein Dienst gestartet ist.

Eine Beispielklasse, wie deine Dienste aussehen könnten.
Code:
public class Service
{
    public string Name { get; set; }

    public bool IsRunning { get; set; }

    public Service(string name)
    {
        this.Name = name;
    }

    public void Start()
    {
        this.IsRunning = true;
    }

    public void Stop()
    {
        this.IsRunning = false;
    }
}

Ich erzeuge ein paar Beispieldienste und füge sie der Liste hinzu. Das enspricht dann deiner variablen Anzahl an Diensten.
Code:
public partial class MainWindow : Window
{
    public List<Service> Services { get; set; }

    public MainWindow()
    {
        Service dienst1 = new Service("Main Service");
        Service dienst2 = new Service("Auto-Config Service");
        Service dienst3 = new Service("Log Service");
        Service dienst4 = new Service("Backup Service");
        Service dienst5 = new Service("Some Helper Service");

        dienst1.Start();
        dienst3.Start();
        dienst4.Start();

        this.Services = new List<Service>()
        {
            dienst1,
            dienst2,
            dienst3,
            dienst4,
            dienst5
        };

        InitializeComponent();
    }
}

Eine ListBox bekommt die Dienste als ItemsSource (Quelle) und ein DataTemplate in die Hand gedrückt.
Code:
<Window ...>
    <ListBox HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="10" ItemsSource="{Binding Services}">
        <ListBox.ItemTemplate>
            <DataTemplate>

                <StackPanel Orientation="Horizontal">
                    <TextBox Text="{Binding Name}" Margin="5,5,10,5" />
                    <Canvas VerticalAlignment="Center" Height="15">
                        <Ellipse x:Name="StartupIndicator" Height="15" Width="15" Stroke="Black" Fill="Red" />
                    </Canvas>
                </StackPanel>

                <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding IsRunning}" Value="True">
                        <DataTrigger.Setters>
                            <Setter TargetName="StartupIndicator" Property="Fill" Value="LightGreen" />
                        </DataTrigger.Setters>
                    </DataTrigger>
                </DataTemplate.Triggers>

            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Window>

Und so sieht das dann aus:
services.PNG
 
Zurück
Oben