Laden...

Controls (zb Button) wärend Laufzeit erzeugen

Erstellt von GreenApple vor 14 Jahren Letzter Beitrag vor 14 Jahren 7.778 Views
GreenApple Themenstarter:in
2 Beiträge seit 2009
vor 14 Jahren
Controls (zb Button) wärend Laufzeit erzeugen

Also, ich versuch mich kurz und knapp ausdrücken, ich habe mir mehrere gedanken darüber gemacht, jedoch bisher zu keiner funktionierenden lösung gekommen.
Also, was genau meine ich mit Objekten wärend der Laufzeit erzeugen.
Beispiel wäre:
Butten mit dem ein neuer button an einer variablen X/Y-position erzeugt werden soll, drückt man den button erneut, kommt ein weiterer.
bisher habe ich es mit folgendem probiert:


public void create (int x,string name)
            {
                
                System.Windows.Forms.Button newobjekt = new System.Windows.Forms.Button();
                newobjekt.Location = new System.Drawing.Point(12, x);
                newobjekt.Name = name;
                newobjekt.Size = new System.Drawing.Size(50, 50);
                newobjekt.TabIndex = 0;
                newobjekt.Text = name;
                newobjekt.UseVisualStyleBackColor = true;
                newobjekt.Show();
               
            }

in dem beispielcode ist nur die X-posi variable, ich weis, jedoch wie gesagt, scheint mir noch etwas zu fehlen. Hoffe auf baltige rückmeldung 😄 mit ideen und erklärungen.

PS: aufruf habe ich bisher nur mit normalen classen aufruf gemacht ^^, nicht dass es daran liegt.

mfg Apple ~

2.223 Beiträge seit 2005
vor 14 Jahren

Hallo GreenApple und Herzlich Willkommen hier im Forum,

Ein kleiner Rat zu Beginn, schau mal in unsere Community-Regeln
oder [Hinweis] Wie poste ich richtig? rein.

ich frage mich gerade seid wann ein Button eine Methode Show hat,

ZB. ein Form hat eine methode Show aber ein Button nicht.

Um Dir aber dennoch ein wenig zu helfen, schau Dir doch mal die Komplette Designer generierte Code Datei an und versuche diese Datei KOMPLETT zu verstehen.

Sobald Du diese Datei verstanden hast, wird Dir dein Fehler schnell bewußt werden.

Es tut mir leid, dass dies vermutlich nicht die Antwort ist die Du haben wolltest, Doch wir geben hier lieber Anleitungen zur selbsthilfe, anstatt Die das problem zu Lösen.
Das Bringt Dir einfach viel mehr.

Herzliche Grüße
Lars

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Lars Schmitt,

ich frage mich gerade seid wann ein Button eine Methode Show hat,

Seit Anfang an. 😃 Jedes Control und nicht nur die Forms haben Show- und Hide-Methoden, die bei normalen Controls einfach nur den Zustand von Visible ändern ...

Hallo GreenApple,

... allerdings ist bei neu erzeugten Control Visible ohnehin auf true. Du brauchst Show also nicht aufzurufen und es nützt auch nichts, wie du gemerkt hast.

Doch wir geben hier lieber Anleitungen zur selbsthilfe, anstatt Die das problem zu Lösen.

So ist es!

Um Dir aber dennoch ein wenig zu helfen, schau Dir doch mal die Komplette Designer generierte Code Datei an und versuche diese Datei KOMPLETT zu verstehen.

Um das vielleicht doch noch etwas einzugrenzen: Dir fehlt die Anweisung, mit der das Control zum Form hinzugefügt wird.

herbivore

2.223 Beiträge seit 2005
vor 14 Jahren

Hallo herbivore,

das mit dem Button stimmt, ich mach einfach schon zu lange WPF,

Natürlich hat ein Button eine Show Methode, was ja auch Sinn macht, da auch der Button eine Control ist und Die Show Methode genau aus dieser Ableitung herrührt.

Herzliche Grüße
Lars

T
34 Beiträge seit 2009
vor 14 Jahren

Hallo,
ich hab ein aehnliches Problem und zwar moechte ich ein ganzes bestehndens Form immer wieder untereinander per Button_Click einfuegen.

Ist das so einfach moeglich oder muss ich quasi jedes Control element neu einfuegen? Weil ich koennte mir denke ich menge arbeit ersparen, wenn ich einfach ein ganzes Form an eine bestimme stelle "kopieren" koennte.

Vielen Dank fuer die Ideen.

Tom

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Tschebbe,

Controls kopieren kannst du nicht. Aber du kannst natürlich den Code zur Erzeugung deiner Controls in eine Methode packen und die dann immer wieder aufrufen.

herbivore

T
34 Beiträge seit 2009
vor 14 Jahren

mh... das ist aber ungeschickt, ich dachte ich koennte mir jetzt einfach ein neues Form erstellen und dann darin mehrmals einfach mein altes bestehendes form hinzufuegen und auch wieder loeschen. d.h. ja jetzt fuer mich, ich muss meine komplette oberflaeche neu schreiben und dann ganz neu anfangen...

Gibts eine andere moeglichkeit, dass ich z.b. meine Forms halt zwei mal aufrufe und sich eben zwei fenster oeffnen und ich in beiden parallel arbeiten kann?

Tom

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Tschebbe,

ich muss meine komplette oberflaeche neu schreiben und dann ganz neu anfangen...

ich verstehe nicht, wie du darauf kommst. Wenn du schon eine Oberfläche hast, hast du doch so gut wie allen Code, den du brauchst. Schau dir doch mal an, was der Designer an Code generiert. Den kannst du doch für meinen Vorschlag nehmen.

Weiteres Strichwort ist UserControl. Dadurch kannst du natürlich auch mehrere Controls logisch zusammen fügen, und dann quasi als ein Control behandeln.

herbivore

3.825 Beiträge seit 2006
vor 14 Jahren

Hallo Tom,

ich verstehe noch nicht so ganz was Du willst.

Wenn Du mehrere gleiche Forms nebeneinander haben willst kannst Du Dein Form mehrfach aufrufen. Allerdings können die Forms dann untereinander nicht (so einfach) kommunizieren.

Wenn Du mehrere gleichartige Eingabemasken untereinander haben willst dann pack Deine Controls doch in eine Groupbox und zeige die mehrfach an.
Die erste Groupbox baust Du im Designer, die weiteren legst Du per Code an :

textBox[i] = new TextBox();
textBox[i].Size = textBox1.Size;
textBox[i].Location = textBox1.Location;
...

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

T
34 Beiträge seit 2009
vor 14 Jahren

ja, also ich wollte mehrmals das selbe form in einem form aufrufen.
Das funktioniert bisher auch recht gut mit:


            ECOUserForm subform = new ECOUserForm();
            subform.TopLevel = false;
            subform.Parent = this;
            subform.Show();

und

IsMdiContainer=True;

Ist das keine so gaengige Methode ein from in ein anderes einbinden?

Jetzt muss ich das nur noch optisch irgendwie hinbkommen, aber das sollte ja kein problem werden.

Danke fuer die anregungen

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Tschebbe,

und zwar moechte ich ein ganzes bestehndens Form immer wieder untereinander per Button_Click einfuegen.

also dabei dachte ich ehrlich gesagt nicht an MDI, sondern darum, dass es ihr darum geht den Inhalt eines Forms (also seine Controls) mehrfach in ein anderes Form einzufügen.

Aber wenn du MDI willst, ist es auch gut. Allerdings solltest du das nicht über die Zuweisungen

subform.TopLevel = false;
subform.Parent = this;

machen, sondern durch Setzen von MdiParent auf this des aufrufenden Forms.

herbivore

T
34 Beiträge seit 2009
vor 14 Jahren

ok, also ich hab jetzt eine ganze weile herumprobiert und bin zu dem entschluss gekommen ein UserControl sei sinnvoll. Ich hab mein altes From in ein UserControl umgebaut und mir ein neue Host-Form gebaut mit dem ich mein UserControl immer wieder starten kann, dass funktioniert auch alles wunderbar.

Aber mein UserControl funktioniert nicht mehr zu 100%. eigentlich sollte es daten aus Excel bearbeiten und in eine Output datei schreiben. Mein OpenFileDialog und mein SaveFileDialog gehen noch. Dann start das UserControl einen Backgroundworker und da scheint irgendwie der hund begraben zu sein, weil er arbeitet und arbeitet und ich weiss nicht so richtig, wie ich einsehen kann was gearbeitet wird.

Gibt es eine moeglichkeit die Outputs des UserControls anzuschauen, weil bisher hatte ich meine ganzen sortier prozesse einfach mit Console.WriteLine() ausgegeben, aber das sehe ich ja jetzt nicht mehr, weil man auch mehrer starten kann.

Hier auch noch der Code, weil meistens sagt der mehr 😉


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ButtonArrayproject
{
    class ButtonArray : System.Collections.CollectionBase
    {
        private readonly System.Windows.Forms.Form HostForm;

        public ButtonArray(System.Windows.Forms.Form host)
        {
            HostForm = host;
            this.AddNewButtonArray();
        }

        public void AddNewButtonArray()
        {
            ECOUserControl aUserControl = new ECOUserControl();
            this.List.Add(aUserControl);
            HostForm.Controls.Add(aUserControl);
            aUserControl.Top = Count * 400;
            aUserControl.Left = 100;
            aUserControl.Tag = this.Count;
        }

        public System.Windows.Forms.UserControl this[int Index]
        {
            get
            {
                return (System.Windows.Forms.UserControl)this.List[Index];
            }
        }
        public void Remove()
        {
           if (this.Count > 0)
           {
              HostForm.Controls.Remove(this[this.Count -1]);
              this.List.RemoveAt(this.Count-1);
           }
        }
    }
}

host Form


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 ButtonArrayproject
{
    public partial class Form1 : Form
    {
        ButtonArray MyControlArray;

        public Form1()
        {
            InitializeComponent();
            MyControlArray = new ButtonArray(this);

        }

        private void btnAdd_Click(object sender, EventArgs e)
        {
            MyControlArray.AddNewButtonArray();
        }

        private void btnRemove_Click(object sender, EventArgs e)
        {
            MyControlArray.Remove();
        }
    }
}


[EDIT]
Ich hab gerade festgestellt, dass Excel gar nicht mehr gestartet wird. Obwohl es davor in einem Form ging.

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Tschebbe,

Console.WriteLine() ausgegeben, aber das sehe ich ja jetzt nicht mehr, weil man auch mehrer starten kann.

die Sichtbarkeit von Console.WriteLine-Meldungen hängt überhaupt nicht davon ab, ob du nun ein Form oder mehrere UserControls hast.

ich weiss nicht so richtig, wie ich einsehen kann was gearbeitet wird.

Mit dem Debugger. Beachte dazu auch [Hinweis] Wie poste ich richtig? Punkt 1.1.1.

herbivore

T
34 Beiträge seit 2009
vor 14 Jahren

gut die probleme waren auch gleich behoben.

Jetzt wird Excel aber tortzdem noch nicht gestartet.

T
34 Beiträge seit 2009
vor 14 Jahren

ok. ganz grosser fehler meinerseits ...