Computerhilfen.de Logo
Forum
Tipps
News
Frage stellen

C#/.NET - dynamisch Objekte hinzufügen/entfernen

Hallo,

ich möchte mit Hilfe einer numericUpDown-Komponente die Anzahl der TextBoxes steuern, die im Projekt angezeigt werden. Habe dazu auch eine Funktion geschrieben, die aber nicht ganz funktioniert. Hier erstmal der Code:

TextBox[] eintrag;
...
//Initialisierung
eintrag = new TextBox[1];
eintrag[0] = new TextBox();
eintrag[0].Text = "Startseite";
eintrag[0].Left = 104;
eintrag[0].Top = 141;
tabPage6.Controls.Add(eintrag[0]);
...
//Funktion zum Ändern
private void numericUpDown1_ValueChanged(object sender, System.EventArgs e)
{
int soll = (int)numericUpDown1.Value;
if(eintraege > soll)
{
for(int i=soll; i<eintraege; i++)
{
tabPage6.Controls.Remove(eintrag[i]);
}
eintraege = soll;
eintrag = new TextBox[eintraege];
}
else
{
int start = eintraege;
eintraege = soll;
eintrag = new TextBox[eintraege];
for(int i=start; i<eintraege; i++)
{
eintrag[i] = new TextBox();
eintrag[i].Left = 104;
eintrag[i].Top = 141 + i*30;
tabPage6.Controls.Add(eintrag[i]);
}
}
}

Es wird also unterschieden ob eine Textbox hinzugefügt oder entfernt werden muss, wenn der Wert des numericUpDown geändert wird.

Nun funktioniert das Hinzufügen einwandfrei (zumindest optisch). Wenn ich aber den Wert verringere, wird beim ersten Verringern eine Textbox gelöscht, beim weiteren Veringern passiert aber nix mehr.

Warum? Eigentlich sollte der Code doch universell funktioieren...

Danke schonmal Spawn

Antworten zu C#/.NET - dynamisch Objekte hinzufügen/entfernen:

Du machst dir mit

eintrag = new TextBox[eintraege];
dein Array kaputt, und beim nächsten mal geht dann
tabPage6.Controls.Remove(eintrag[i]);
schief.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Das hatte ich befürchtet :P

Mache noch nicht lange was mit C# und kenne daher die dynamische Speicherverwaltung nicht...

Wie könnte ich es denn realisieren, dass ich Array bei Änderung größer oder kleiner mache?
Zuerst wollte ich es jedesmal neu aufbauen ala:

delete eintrag;
eintrag = new ....

Aber das geht bei C# ja nicht.

Ich würd spontan sagen, nimm nen Stack statt nem Array.

System.Collections.Stack ctlStack = new System.Collections.Stack();

Zum erzeugen neuer Textfelder:
while( ctlStack.Count < soll )
{
    TextBox box = new TextBox();
    box.Left = ...
    box.Top = ...
    tabPage6.Controls.Add( box );
    ctlStack.push( box );
}

Zum entfernen:
while( ctlStack.count > soll )
{
    tabPage6.Controls.Remove( ctlStack.pop() );
}

Ungetestet ;-)

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Klingt gut. Hinzufügen geht auch super. Jedoch kommt in folgender Zeile folgende Fehlermeldung:

tabPage6.Controls.Remove( ctlStack.Pop() );

Die beste Übereinstimmung für die überladene Methode 'System.Windows.Forms.Control.ControlCollection.Remove(System.Windows.Forms.Control)' hat einige ungültige Argumente

Argument '1': kann nicht von 'object' zu 'System.Windows.Forms.Control' konvertiert werden

 ???

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Okay, hat sich erledigt. Habs auf Control gecastet und jetzt geht's einwandfrei. Danke!!

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Und noch ein drittes Posting...

Nur für die, die es interessiert: Ich habe das ganze jetzt per ArrayList realisiert um nach Hinzufügen von Textboxen diese dann komfortabel wieder auslesen zu können. Das ganze sieht dann so aus:

//Die Deklaration
System.Collections.ArrayList eintragArray = new ArrayList();
...
//Das Hinzufügen und Entfernen
while( eintragArray.Count < soll )
{
TextBox box = new TextBox();
tabPage6.Controls.Add( box );
eintragArray.Add(box);
}
while( eintragArray.Count > soll )
{
tabPage6.Controls.Remove((Control)eintragArray[eintragArray.Count-1]);
eintragArray.RemoveAt(eintragArray.Count-1);
}
...
//Das Abrufen der Werte
tempBox = (TextBox)eintragArray[i];
string eintrag = tempBox.Text;

Danke für die Hilfe "...." und Gruß Spawn

« Lauflicht auf Relaiskarte mit Vorgabe des BitmustersC Tutoril für hardwear Progrmierung »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Quellcode
Ein Quellcode, auch als Quelltext bekannt, bezeichnet den unkompilierten Programm-Code einer Software. Quell- oder Programm-Code ist der auch für Menschen lesbare Co...

Unicode
Unicode ist ein international anerkannter Standard, der als universeller Zeichencode ("Universal Code") dient und durch das Unicode-Konsortium entwickelt und verwaltet wi...

QR-Code
QR-Codes, die Abkürzung für "Quick Response Codes", sind eine Form von zweidimensionalen Barcodes. Damit lassen sich Informationen schnell und effizient speiche...