Anzeige

 Zusätzliche Controls zur Laufzeit


Jeiss

Grünschnabel
#1
Hallo alle zusammen, jetzt ist es soweit. Jetzt komme ich nicht mehr dran vorbei. Ich habe mich immer davor gedrückt zur Laufzeit Steuerelemente auf eine Form hinzufügen zu müssen, und das auch noch in einer variablen Stückzahl. Auf einer Form habe ich mehrere "feste" Labels, TextBoxen,ComboBoxen u. Buttons die ich einfach schon in der Entwurfs-Ansicht in der IDE bearbeite. Nun ist es aber so, dass ich auf diese Form auch eine nict fest definierte Anzahl ( von 0 bis ....n ) an sätzlichen Steuerelemente benötige. Habe mich noch nich entschieden welche Controls es sein sollen, aber das ist ja auch nicht wichtig. Es sollen schon einfache Controls sein, d.h. wahrscheinlich ComboBoxen oder sogar TextBoxen. Ich nehme ja mal an, dass die Position (Location) des Ersten dieser zusätzlichen Controls ausschlaggebend ist und danach alle übrigen zusätzlichen Controls einfach nur um einen bestimmten Wert verschoben werden. Ach ja, es wäre toll, wenn ich die neuen Controls nicht unbedingt ans "Ende" d.h. hinter die anderen "festen" Controls anhaften müsste sondern an einer beliebigen Stelle auf der Form. Ich wäre für jede Hilfe, jeden Link oder Anregung sehr dankbar. Ich benutze übrigens VB 2008 express edition.
Danke,
Jeiss
 

Spyke

Capoeirista
Premium-User
#2
du instanziiertst einfach dein neues Control und fügst dieses der ControlCollection (Controls Eigenschaft) deines gewünschten Containers hinzu.
Über die Eigenschaft Location bestimmst du Position und über Size die Größe.

Code:
Label lb=new Label()
lb.Text="hallo welt";
lb.Location=new Point(5,5);

meineForm.Controls.Add(lb);
 

Jeiss

Grünschnabel
#3
Hallo Spyke, schön dass du dich meldest. Ja genau so hatte ich mir den Teil des Codes auch vorgestellt. Nur in deinem kleinem Beispiel geht es um "nur" ein Label. Das ist ja schön und gut, aber in meiner Anwendung weiss ich ja nicht wieviele Labels der Form hinzugefügt werden müssen. Dies hängt nämlich von der Anzahl der Einträge in einer Datenbank ab. Gibt die Abfrage der DatenBank (bessergesagt der geladenen Tabelle) drei Werte zurück, dann benötige ich eben auch drei Controls auf der Form. Gibt die Abfrage aber z.B.acht zurück dann benötige ich acht Controls. (Es dürten auch kaum mehr als zehn sein, es geht nämlich um die Anzahl an verschiedene Emailadressen der Kontakte aus meiner DB. Und da müsste es ja im allgemeinen mit 1-5 ausreichen!) Siehst du mein Problem jetzt? Die Anzahl an Controls auf der Form muss sich also der Anzahl an Einträgen aus der DB anpassen. Und dann müsste sich (später wenn alles fein klappt) auch die Höhe der Form sich anpasse.
So jetzt bleibt mir nur noch zu hoffen dass dir noch was einfallen wird. Denn ich habe in der Zwischenzeit noch fleissig weiter gegoogled, habe aber sogar bei MSDN nichts gefunden. Ich gebe irgendwie nicht die passende suchbegriffe ein...? Ich bin mir abe ziemlich sicher, dass ich vor einigen Jahren durch zufall auf einen solchen Beitrag bei MSDN gestossen bin. Ich war damals auf der Suche nach einer Lösung in einer VBA-Angelegenheit.
Danke,
Jeiss
 
#4
Nun ja, der Code von Spyke zeigt ja nur das Prinzip, wie ein Control zur Laufzeit hinzugefügt wird. Das funktioniert mit 1, 10 oder 100 Controls auf dieselbe Art und Weise.

Was mir dazu noch einfällt:
  • Eine Anzahl gleichartiger Elemente verwaltet man zweckmäßigerweise in einem Array und verwendet Schleifen für die Erzeugung.
  • Die Größe einer Form lässt sich sehr leicht über die "Width"- und "Height"-Eigenschaften verändern.
Wo genau siehst du denn dein Problem?

Gruß
MCoder
 

Jeiss

Grünschnabel
#5
Hi MCoder, ganz schön mutig von dir dich mit einem Anfänger wie ich einer bin abgeben zu wollen. Danke sehr. Ja wo ich das Problem sehe, ich kann ja nicht 3, 5 oder sechs Labels "lb" nennen. Ich will ja auch in meinem Programm auf sie zugreifen können. Die müssen doch alle einen unterschiedlichen Namen erhalten? Geht das über eine Schleife, wo ich dann den Schleifenzähler fur den Namen des Labels verwenden kann? Also ich muss ja den den Text des Label_n zuerst setzen können und später diesen Text aber auch verwenden können. Also ich betone nochmal dass die Anzal der Labels ja bei jedem Ladevorgang der Form ändert. Wie soll ich mir den Code denn vorstellen? Irgendwie so?
Code:
Label lb=new Label()
For i as integer = 0 to Einträge -1
lb.Text="hallo welt";
lb.Name = "Label " & i
lb.Location=new Point(5,5);
meineForm.Controls.Add(lb);
next i
Also wie du sehen kanns fehlt mir total der Durchblick. Jetz versteht hoffentlich jeder warum ich mich bis jetzt immer davor gedrückt habe einen solchen Code zu erstellen;)
Ich bedanke mich bei euch allen für eure Hilfe,
Jeiss
 

Masterclavat

Erfahrenes Mitglied
#6
C# und Vb.Net zu mischen ist leider nicht möglich, dein Code wird also wohl nicht kompilierbar sein. ;)

Hier ist mal ein Beispiel, wie man dynamisch viele Labels erstellt.

Code:
Dim Labels As New Collections.Generic.List(Of Label)

For i As Integer = 0 to Einträge-1
    labels.Add(new label())
    Labels(i).Name = "Label" & i
    Labels(i).Location = new point(5,10*i)
    Labels(i).Text = "Ich bin Label Nummer " & i
    me.controls.add(labels(i))
Next
 
Zuletzt bearbeitet von einem Moderator:

Jeiss

Grünschnabel
#7
Hallo MasterClavat.
For i as double = 0 to unendlich
Vielen Dank!
Next i
Super, da ist ja alles drin was ich brauche. Name und Location-Anpassung.
Werde das sofort an meine Anwendung anpassen. Hab mich nämlich in der Zwischenzeit entschieden Comboboxen als Controls einzusetzen.
Ich nehme mir trotz eurer wertvollen Hilfe doch die Freiheit das Thema noch nicht abzuschliessen. Denn wie ich mich kenne tritt doch bald wieder ein Problem auf mit dem ich anfangs gar nicht gerechnet hatte. Bis hier hin auf jedenfall ein grosses Dankeschön an euch alle.:p
Jeiss
 
#10
Hi

Was haben die Links mit dem Thema zu tun :confused:
Hier ging es um Controls zu Laufzeit erstellen. Dafür ist Reflection etwas übertrieben.

:offtopic:
@Jeiss
double bis unendlich? Meinst du nicht, dass du da schnell an deine, äh die von Double stößt? :D
 
#11
Hallo ich habe zu dem oben genannten Thema noch eine Frage, gibt es eine Möglichkeit verschiede Steuerelementtypen zur Laufzeit zu erstellen.
Ich stelle mir das so vor. Die Daten stehen in einer Datenbank also Steueremelementtyp, Beschriftung, Reihenfolge...

Jetzt möchte ich die Klasse so schreiben, das egal welches Steuerelement ich aus der DB bekomme dieses angelegt wird.

Vielen Dank für eure Unterstützung.

Viele Grüße
Ratze
 

Spyke

Capoeirista
Premium-User
#14
Reflection wäre ein weg, aber finde ich ev. auch bissel übertrieben.
Um was für Controls geht es denn?

Ich würde eher, vereinfacht, sowas in der Form machen:
Code:
using(DbDataReader reader=GetReader())
{
  while(reader.read())
  {
    Control ctrl;
    switch(reader.GetString("Art"))
    {
     case "TBOX":
        ctrl = new TextBox();
        break;
     case "LB":
        ctrl = new Label();
        break;
    }
    ctrl.Location = reader.GetPoint("Location");
    ctrl.Size = reader.GetSize("Size");
    ctrl.Text = reader.GetString("Text");
    ctrl.Name = reader.GetString("Name");

    this.Controls.Add(ctrl);
  }
}
(Achtung, die reader Methoden sind nicht .Net Framework komform)

Spätestens wenn du auch noch auf ereignisse der controls reagieren willst, denke ich,
wäre von vornherein eine klare struktur mit fest definierten Typen eventuell besser.
 
Anzeige
Anzeige