Laden...

Mit Mausklick an dieser Stelle der Form eine Combo Box erstellen und aufklappen lassen?

Erstellt von Tommylik vor 4 Jahren Letzter Beitrag vor 4 Jahren 2.649 Views
T
Tommylik Themenstarter:in
51 Beiträge seit 2019
vor 4 Jahren
Mit Mausklick an dieser Stelle der Form eine Combo Box erstellen und aufklappen lassen?

Hallo an alle,

Ich bin der Tom und neu hier bei Euch.

Ich arbeite in der Instandhaltung bei einem Teilezulieferer.
Fachrichtung Elektrik und SPS. Da habe ich mit AWL, SCL, VBA zu tun.

Mit VBA habe ich schon ein bisschen Erfahrung gesammelt.
Ich würde das was ich vorhabe auch lieber mit VBA machen aber angeblich
brauche ich dafür eine Variante von C. Wir haben bei uns C# im Einsatz.

Deswegen meine Frage die sich nur auf Forms beziehen.

Ich habe eine leere Form als Grundlage die Größe ist erstmal egal.
Kann C# wenn ich mit der Maus irgendwo hinklicke mir an dieser Stelle der Form eine Combo Box erstellen und aufklappen??

So zu sagen über Koordinaten. X=234 und Y=456 = Combo Box.

Der Inhalt der Combo Box ist auch erstmal uninteressant.

Ich hoffe es ist möglich. Vielen Dank für eventuelle Antworten im voraus.

Mfg Tom

1.029 Beiträge seit 2010
vor 4 Jahren

Hi,

ja das ist grundlegend möglich. Solltest dir einfach mal zum Test eine leere Form erstellen - eine Combobox draufmachen - und dir dann den vom Designer erstellten Code anschauen - dann verstehst du sehr schnell wie's funktioniert. (Windows Forms sollte dir hier am Leichtesten fallen vermute ich)

LG

38 Beiträge seit 2019
vor 4 Jahren

Hi,
Taipi88 hat recht grundlegend ist es machbar und auch nicht all zu kompliziert. Ich hab dir hier mal ein Sample gemacht. Ich gehe davon aus das du Visual Studio als Entwicklungsumgebung gewählt hast ansonsten dürfte auch nicht so viel anders sein.

1: Win-Forms Projekt erstellen und dann auf das Properties-Fenster(Eigenschaften) gehen. Dort gibts einen Blitz da drückst du dann drauf dann suchst du "MouseClick"(Ganz wichtig nicht Click sondern MouseClick weil du sonst die Koordinaten nicht hast). Doppelklick auf die leere Textbox und dann kommst du zum Code.

2: Code:

ComboBox cb = null;
        bool cbIsShown = false;
        private void GetData()
        {
            string[] data = { "test1", "test2", "test3" };
            cb = new ComboBox();
            cb.Items.AddRange(data);
            cb.Size = new Size(50, 12);
            cb.SelectedIndexChanged += Cb_SelectedIndexChanged;
        }
        private void Form1_MouseClick(object sender, MouseEventArgs e)
        {
            //Optional nur wenn die rechte Masutaste gedrückt ist machen.
            if (e.Button == MouseButtons.Right)
            {
                if (cb == null) return;
                cb.Location = e.Location;
                if (!cbIsShown)
                {
                    this.Controls.Add(cb);
                    cbIsShown = true;
                }              
            }
            else
            {
                this.Controls.Remove(cb);
                cbIsShown = false;
            }
        }

        private void Cb_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cb == null) return;
            this.Text = cb.Items[cb.SelectedIndex].ToString();
        }

Dann ist es eigentlich schon fertig. Wichtig wenn du den inhalt für deine Combobox erhaltenhast sofort inizialisieren. die Medthode GetData simuliert dein vorgehen welches du machen solltes. Bzw. Diese Medthode kannst du auch Sync laufenlassen solange du cb zur verfügung hast.

Viel Spaß beim Coden

LG BierDav

Trifft eine Programmiererin ihre Freundin und die Freundin fragt: "Mit welchen Typen hängst du so in letzter Zeit rum?" Die Programmiererin antwortet: „integers, booleans und strings“

T
Tommylik Themenstarter:in
51 Beiträge seit 2019
vor 4 Jahren

Hallo Taipi88 und BierDav,

Vielen Dank für Eure Antworten und die Hilfe.

@BierDav

Ich habe Microsoft Visual Studio Community 2019.

Ich denke das ich deine Anweisung nicht richtig durch geführt habe
sonst müsste es doch funktionieren. Wenn ich den Code ausführen lasse
dann erscheint die Form aber wenn ich mit der Mouse drauf klicke passiert nichts.


[
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        ComboBox cb = null;
        bool cbIsShown = false;
        private void GetData()
        {
            string[] data = { "test1", "test2", "test3" };
            cb = new ComboBox();
            cb.Items.AddRange(data);
            cb.Size = new Size(50, 12);
            cb.SelectedIndexChanged += Cb_SelectedIndexChanged;
        }
        private void Form1_MouseClick(object sender, MouseEventArgs e)
        {
            //Optional nur wenn die rechte Masutaste gedrückt ist machen.
            if (e.Button == MouseButtons.Right)
            {
                if (cb == null) return;
                cb.Location = e.Location;
                if (!cbIsShown)
                {
                    this.Controls.Add(cb);
                    cbIsShown = true;
                }
            }
            else
            {
                this.Controls.Remove(cb);
                cbIsShown = false;
            }
        }

        private void Cb_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cb == null) return;
            this.Text = cb.Items[cb.SelectedIndex].ToString();
        }
    }
}

Keine Fehler das ist für mich als Anfänger nicht Hilfreich.

Was habe ich falsch gemacht?

Vielen Dank nochmal für Eure tolle Hilfe.

Mfg Tom

4.931 Beiträge seit 2008
vor 4 Jahren

Benutzt du denn auch die rechte Maustaste?
Ansonsten schreib

if (e.Button == MouseButtons.Left)
T
Tommylik Themenstarter:in
51 Beiträge seit 2019
vor 4 Jahren
Mausklick erstellt ComboBox

Hallo Th69,

Vielen Dank für deine Antwort.

Ja, ich habe jede Taste ausprobiert.

Und wenn ich den Code auf links ändere bleibt es gleich.

Vielen Dank für Eure Unterstutzung.

Mfg Tom

1.029 Beiträge seit 2010
vor 4 Jahren

Hi,

ich vermute du hast lediglich die Methode Form1_MouseClick nicht als EventHandler für den Click registriert? (Im Zweifel den Text von BierDav genau lesen - da steht prinzipiell drin wie man das macht)

LG

Edit: Wenn du's richtig gemacht hast steht auf jedem Fall im Designer bei MouseClick der Name der vorgenannten Methode.

S
248 Beiträge seit 2008
vor 4 Jahren

Versuch diese Änderung:

        public Form1()
        {
            InitializeComponent();
            GetData();
        }

Grüße

4.931 Beiträge seit 2008
vor 4 Jahren

Also hast du GetData() nirgendwo aufgerufen?
Solche Fehler solltest du mittels [Artikel] Debugger: Wie verwende ich den von Visual Studio? selber herausfinden (in dem Fall ist cb immer noch null und return wird vorzeitig aufgerufen).

PS: Statt GetData würde ich die Methode eher InitializeComboBox nennen.

T
Tommylik Themenstarter:in
51 Beiträge seit 2019
vor 4 Jahren

Hallo an alle,

Vielen Dank erstmal für Eure Hilfe.

@Taipi88

Edit: Wenn du's richtig gemacht hast steht auf jedem Fall im Designer bei MouseClick der Name der vorgenannten Methode.

Das habe ich richtig gemacht. Der Name steht da.

@Th69

Nein hatte ich nicht.

Haltepunkte habe ausprobiert, aber wenn man nicht weiß wo man hinschauen muss
ist es schwer. Für Euch ist das alles Routine.

PS: Statt GetData würde ich die Methode eher InitializeComboBox nennen.

Verstehe ich es Richtig das eine Methode eine Komponente ist?

InitializeComponent(); -> InitializeComboBox();

Jetzt funktioniert es natürlich. Vielen Dank dafür.
Und jetzt sehe ich das meine Frage etwas blöde war weil ich vergessen habe
das die ComboBox mit der Auswahl aus der ComboBox an der stelle wo
ich hinklicke stehen bleiben soll.
Zur Zeit wird die ComboBox gelöscht wenn ich woanders hinklicke.
Was kein Sinn macht.

Die Auswahl aus der ComboBox wird in der Lokalen Variable String Data abgespeichert.
Kann man das mit denn Koordinaten wo ich hingeklickt habe verbinden.

Oder ist meine Denkweise so falsch?

Vielen Dank nochmal für Eure tolle Hilfe.

Mfg Tom

16.807 Beiträge seit 2008
vor 4 Jahren

Eine Methode ist ein Konstrukt in der Objektorientierten Programmierung.

public ReturnType MethodName(Parameters)
{
}

WinForms - Component vs. Control

Vereinfacht:

  • Eine Komponente ist etwas, das nicht zwangweise Abhängigkeit an die UI hat, aber zB Logik beinhaltet.
  • Ein Control hat UI Fähigkeiten
4.931 Beiträge seit 2008
vor 4 Jahren

@Tommylik: Nur, daß wir uns nicht mißverstehen.
Der Aufruf von InitializeComponent() muß zwingend im Konstruktor bleiben (denn dieser initialisiert die Form und seine Subelemente).

Nur dort dann noch den zusätzlichen Aufruf von GetData() (so wie Spook schon geschrieben hat) bzw. eben nach Umbenennung InitializeComboBox() hinzufügen.

Wenn du jedoch bei jedem Klick eine neue ComboBox erzeugen willst, dann sieht der Code etwas anders aus.
Du müßtest dann eine Methode CreateComboBox erzeugen, welche ein neues ComboBox-Objekt erzeugt und als Rückgabewert zurückgibt.

Aber was ist denn der genaue Anwendungsfall oder soll das nur Spielerei sein?

T
Tommylik Themenstarter:in
51 Beiträge seit 2019
vor 4 Jahren

Hallo TH69,

Vielen Dank für deine Antwort und Hilfe.

Nein wir tun uns nicht Missverstehen.

InitializeComponent()

Das habe ich schon ausprobiert und habe ein Fehler bekommen.

Nein das ist keine Spielerei. Soll eine Art Bewertung sein.

Als Grundlage eine Form mit einem Bild/Grafik von einem Teil.

Und mit der Maus klickt man dann an einer Stelle wo man eine Bewertung abgeben möchte die ComboBox erscheint, man macht seine Auswahl z.B gut oder schlecht oder was auch immer man in die Liste aufnimmt.

Vielen Dank nochmal für deine Hilfe.

Mfg Tom

T
Tommylik Themenstarter:in
51 Beiträge seit 2019
vor 4 Jahren

Hallo TH69,

Mit jedem Klick ensteht ja eine neue ComboBox.
Die muss ja dann nummeriert werden.

Ich habe mir folgendes mit dem I-Net zusammen gebastelt.

Kann ich das gebrauchen?



private ComboBox[] myComboBoxes;
private Int16 nummer;

           myComboBoxes = new ComboBox[nummer];

// Hochzählen
for (Int16 i = 1; i < nummer; i++)
{
           // Neue ComboBox erzeugen
           myComboBoxes[i] = new ComboBox();
           
           myComboBoxes[i].Location = new Point(e.X, e.Y);
           myComboBoxes[i].Width = 80;
           myComboBoxes[i].Name = "txbUserName" + i.ToString();

           // ComboBox auf dem Formular plazieren
           Controls.Add(myComboBoxes[i]);

}

Ich glaube das dass ins MouseEvent gehört damit ich auf e.Location
zugriff habe um mit Point festzulegen wo die ComboBox plaziert wird.

Könntest du mir bitte helfen.

Vielen Dank für die tolle Hilfe.

Mfg Tom

4.931 Beiträge seit 2008
vor 4 Jahren

Vom Prinzip her stimmt dein Code, nur möchtest du ja je Mausklick nur jeweils eine ComboBox erstellen (daher auch mein Hinweis auf CreateComboBox) und die Schleife mußt du deshalb dort entfernen.
Also schematisch:


ComboBox comboBox = CreateComboBox(e.x, e.y) // + evtl. noch weitere Parameter hinzufügen

Controls.Add(comboBox);

Und statt dem Array solltest du List<T> (d.h. konkret List<ComboBox>) benutzen, da du so nicht die maximale Anzahl vorher wissen mußt (dynamisches Array):


// als Member
private List<ComboBox> myComboBoxes;

// in obigen Code
myComboBoxes.Add(comboBox);

Und die Methode CreateComboBox überlasse ich dir jetzt als Aufgabe. 😉

F
10.010 Beiträge seit 2004
vor 4 Jahren

Statt diesem rumgefrickel würde ich da doch eher ein ContextMenu nehmen.

T
Tommylik Themenstarter:in
51 Beiträge seit 2019
vor 4 Jahren

Hallo TH69,

Vielen Dank für deine Antwort und Mühe.

Jetzt hast du mich total verwirrt.

Meine erste Frage wäre brauche ich noch den Code von BierDav oder
beruhen deine letzten Hilfestellungen darauf das ich alles neu machen sollte.

Über CreateComboBox gibt es keine Vernüftige Hilfe

Google nicht und Visual Studio-Dokumentation enthält auch nichts.

ComboBox comboBox = CreateComboBox(e.x, e.y)

Deshalb weiß ich auch nichts mit anzufangen.

Wo kann ich Beispiele für CreateComboBox finden.
List<T> in zusammenhang mit einer ComboBox findet man auch nichts
was mir helfen könnte.

Das ist wenn man so wie so nicht viel Ahnung hat nicht hilfreich.

Aber vielen Dank noch mal für deine große Hilfe.

Mal sehen was ich noch heraus finden kann.

Mfg Tom

16.807 Beiträge seit 2008
vor 4 Jahren

Es gibt auch keine Methode CreateComboBox im SDK.
Daher findest Du natürlich auch nichts via Google.

Daher hat Dir Th69 auch geschrieben, dass Du diese selbst schreiben musst:

Du müßtest dann eine Methode CreateComboBox erzeugen, welche ein neues ComboBox-Objekt erzeugt und als Rückgabewert zurückgibt.

public ComboBox CreateComboBox(Parameter.....)
{

}

Sobald Du die Methode erstellt hast, kannst Du diese zur einfachen Verwendung hinzuziehen:

ComboBox comboBox = CreateComboBox(e.x, e.y) // + evtl. noch weitere Parameter hinzufügen

Controls.Add(comboBox);

Diesen Hinweis hat er Dir gegeben, dass Du eine Methode hast, die Du immer wieder aufrufen kannst anstatt den selben Code an 87634324 Stellen zu haben.

T
Tommylik Themenstarter:in
51 Beiträge seit 2019
vor 4 Jahren

Hallo Abt,

Vielen Dank für deine Antwort.

Jetzt habe ich es auch verstanden.
Es gibt also keine Doku darüber. Dann habe ich jetzt ein Problem.
Eine Methode selber erfinden ohne Beispiele das bekomme ich nicht hin.
Ich weiß ja noch nicht mal wo der Code hingehört den ich mir
zusammen gebastelt habe. Das ist mir alles zu kompliziert.

Vielen vielen Dank noch mal an alle für Eure Hilfe.

Mfg Tom

4.931 Beiträge seit 2008
vor 4 Jahren

Methoden erstellen ist aber die elementare Grundlage bei der objektorientierten Programmierung.
Klar kannst du auch ersteinmal alles direkt in der MouseClick-Ereignismethode hinschreiben, aber dann wird der Code zunehmend unübersichtlicher.

In dem links-oben ("unter Ressourcen") verlinkten OpenBook gibt es ein entsprechendes Kapitel:
Visual C#: 3.5 Methoden eines Objekts

Als Anfänger (in "C#") solltest du daher die Grundlagen durcharbeiten und verstehen (evtl. also auch die vorherigen [und nachfolgenden] Kapitel lesen).

T
Tommylik Themenstarter:in
51 Beiträge seit 2019
vor 4 Jahren

Hallo TH69,

Vielen Dank für deine Antwort. Und für den Link. War leider nur Konsole.

War sehr Lehrreich aber damit schreibe ich trotzdem keine Methode.
Weil mir etwas Elementares fehlt. Das Verständnis für diese Art zu Programmieren.
Wenn mir einer auf der Arbeit eine Aufgabe für die SPS gibt dann kann ich mir die
Programmierung gedanklich vorstellen und sehen.
Ich habe heute stundenlang im I-Net nach beispielen gesucht
um mir was zusammen zu basteln.
Der Editor bleibt leer weil ich nicht weiß was, wie und wo ich etwas schreiben muss.
Ich bekomme keine Logik zusammen mit C# damit ich es verstehe.

Vielen Dank noch mal für alles.

Mfg Tom

5.657 Beiträge seit 2006
vor 4 Jahren

Ich habe heute stundenlang im I-Net nach beispielen gesucht
um mir was zusammen zu basteln.
Der Editor bleibt leer weil ich nicht weiß was, wie und wo ich etwas schreiben muss.

Hier gibt es ein paar Links für den Einstieg: [FAQ] Wie finde ich den Einstieg in C#?

Weeks of programming can save you hours of planning

T
Tommylik Themenstarter:in
51 Beiträge seit 2019
vor 4 Jahren

Hallo,

Also meine Versuche sind frustrierend.

Weil ich nicht weiß was ich hier mache. Nur Raten.
Könntet ihr mir wenigstens sagen wie das Grund Gerüst aus zu sehen hat.
Nur die Methoden mit geschweiten Klammern aber kein Inhalt.
1.
2.
3.
usw.

Ist im folgenden Code irgend etwas richtig und oder zu gebrauchen.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
               
        public ComboBox CreateComboBox(int X, int Y) <--- Parameter sind die richtig????
        {
            //?
            return CreateComboBox(X, Y);
            //?
        }


        private void Form1_MouseClick(object sender, MouseEventArgs e)
        {
            ComboBox comboBox = CreateComboBox(e.X, e.Y); // + evtl. noch weitere Parameter hinzufügen

            Controls.Add(comboBox);

        }

        private void Cb_SelectedIndexChanged(object sender, EventArgs e)
         {
             if (? == null) return;
             this.Text = ?.Items[?.SelectedIndex].ToString();
         } 

    }
}

@ TH69

Meinst du so was mit List<T>?? So was ähnliches habe ich im I-Net gefunden.

Dann sind aber logischerweise Fehler drin.

"Combobox" enthält keinen Konstruktor, der 1 Argumente annimmt.

Wo packe ich das hin falls es zu gebrauchen ist.

Das Array was ich vorher hatte war in der Methode InitializeComboBox();
Ich würde sagen in die Methode CreateComboBox


 static class InhaltArray
        {
            private static List<ComboBox> inhalt;

            static InhaltArray()
            {
                inhalt = new List<ComboBox>(20)
                {
                    new ComboBox("Test1"),    Hier kommt ein Fehler
                    new ComboBox("Test2"),    Hier auch 
                    new ComboBox("Test3")     Hier auch
                };
            }

            public static List<ComboBox> Inhalt()

            {
                return inhalt;
            }
        }


Den Code den BierDav geschrieben hat kann ich davon was behalten.
Wenn ja was?

Vielen Dank nochmal für Eure Hilfe und Mühe.

Mfg Tom

5.657 Beiträge seit 2006
vor 4 Jahren

Weil ich nicht weiß was ich hier mache. Nur Raten.

Das sehen wir. Du versuchst Code zu copy & pasten, den du nicht verstehst, und bist dann frustriert, weil er nicht funktioniert. Deswegen schau dir doch bitte erstmal die Grundlagen von C# an, siehe den Link. Du kannst nicht erwarten, daß das alles von alleine funktioniert, oder irgendjemand den Code für dich schreibt.

Wenn man eine Sprache lernen will, dann fängt man ja auch nicht damit an, einen Roman zu schreiben, sondern beschäftigt sich erstmal mit der Grammatik und macht ein paar Übungen.

[FAQ] Wie finde ich den Einstieg in C#?
[Tipp] Schau in die Doku! - Möglichkeiten der Informationsgewinnung

Weeks of programming can save you hours of planning

1
124 Beiträge seit 2012
vor 4 Jahren

Hallo Tommylik,

ich kenne dein Lebenslauf, ich habe ähnlich angefangen.

Bitte gehe weg von dem Static. Da man dies nicht testen kann. Ich habe dir mal 2 Beispiele gemacht, einmal alles in einer Klasse und einmal so wie du es vor hattest die Liste der ComboBoxen in eine zweite Klasse auszulagern, aber ohne Static.

Sieht alles viel aus, aber ist im Prinzip fast das gleiche.

Beispiel 1:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        //Leere Liste erzeugen in der ComboBoxen abgelegt werden können(Damit diese später gehändelt werden können)
        private List<ComboBox> listComboBox = new List<ComboBox>();

        //Zählvariable um die ComboBoxen zu identifizieren zu können
        private int idComboBox = 0;

        public Form1()
        {
            //Steuerelemente die im Designer angelegt wurden erzeugen und anzeigen
            InitializeComponent();
        }

        private void Form1_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                //Leere Combobox erzeugen
                ComboBox comboBox = CreateComboBox(e.X, e.Y);
                //Steuerelment zu der Form hinzufügen
                Controls.Add(comboBox);
            }

            if(e.Button == MouseButtons.Left)
            {
                //ComboBox mit Einträge erzeugen
                ComboBox comboBox = CreateComboBoxWithItems(e.X, e.Y);
                //Steuerelment zu der Form hinzufügen
                Controls.Add(comboBox);
            }
        }

        private ComboBox CreateComboBox(int x, int y)
        {
            //Grundeigenschften festlegen
            ComboBox comboBox = new ComboBox();
            comboBox.FormattingEnabled = true;
            comboBox.Location = new System.Drawing.Point(x, y);
            comboBox.Name = "comboBox" + idComboBox;
            comboBox.Size = new System.Drawing.Size(121, 21);
            comboBox.TabIndex = idComboBox;

            //Event erzeugen, was beim auswählen eines Items passiert
            comboBox.SelectedIndexChanged += ComboBox_SelectedIndexChanged;                   

            //ComboBox mit in die Liste aufnehmen
            listComboBox.Add(comboBox);

            //Id erhöhen
            idComboBox++;

            //ComboBox zurück geben
            return comboBox;
        }

        private ComboBox CreateComboBoxWithItems(int x,int y)
        {
            //Erzeuge mit der ersten Methode eine ganz normale Combobox
            ComboBox comboBox = CreateComboBox(x, y);
            //Füge einträge in diese ComboBox ein
            AddDefaultItems(comboBox);
            //Gebe die Combobox zurück
            return comboBox;
        }

        private void ComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            // Mach was beim Ändern
            //Achtung wird beim Ändern aller Comoboxen aufgerufen
            
            //Combobox Casten
            ComboBox comboBox = (ComboBox)sender;

            //nur bei der zweiten ComboBox ausführen
            if (comboBox.Name.Equals("comboBox1"))
                MessageBox.Show("Glückwunsch, Sie haben die ComboBox 2 erwischt (index 1)","Glückwunsch");

            //Ausgabe der Änderung, als Beispiel was man alles für Daten bei dem Event abgreifen kann
            MessageBox.Show("SelectedIndexChanged von " + comboBox.Name + " auf index: " + comboBox.SelectedIndex.ToString() + "(" + comboBox.Items[comboBox.SelectedIndex].ToString() + ")", "Info");
        }

        private void AddDefaultItems(ComboBox comboBox)
        {
            //Füge Einträge auf die referenzierte ComboBox ein
            comboBox.Items.Add("Eintrag1");
            comboBox.Items.Add("Eintrag2");
            comboBox.Items.Add("Eintrag3");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //Lösche alle Comboboxen beim Klick auf Button 1

            //Gehe alle Elemente aus der Liste:listComboBox durch
            foreach(ComboBox comboBox in listComboBox)
            {
                //lösche die aktuelle ComBoBox von der Form
                Controls.Remove(comboBox);
            }

            //setzte die ID zurück
            idComboBox = 0;
        }
    }
}

Beispiel 2:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        private InhaltList inhaltList;

        public Form1()
        {
            //Steuerelemente die im Designer angelegt wurden erzeugen und anzeigen
            InitializeComponent();

            //Liste erzeugen mit STartindex 10
            inhaltList = new InhaltList(10);
        }

        private void Form1_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                //Leere Combobox erzeugen
                ComboBox comboBox = inhaltList.CreateComboBox(e.X, e.Y);
                //Steuerelment zu der Form hinzufügen
                Controls.Add(comboBox);
            }

            if(e.Button == MouseButtons.Left)
            {
                //ComboBox mit Einträge erzeugen
                ComboBox comboBox = inhaltList.CreateComboBoxWithItems(e.X, e.Y);
                //Steuerelment zu der Form hinzufügen
                Controls.Add(comboBox);
            }
        }             


        private void button1_Click(object sender, EventArgs e)
        {
            //Lösche alle Comboboxen beim Klick auf Button 1

            //Gehe alle Elemente aus der Liste:listComboBox durch
            foreach(ComboBox comboBox in inhaltList.GetAllComboBox())
            {
                //lösche die aktuelle ComBoBox von der Form
                Controls.Remove(comboBox);
            }

            //setzte die ID zurück (Achtung, wenn vorher der Startindex bei 10 war, dann ist nach dem Löschen der Index wieder bei 0)
            inhaltList.IdComboBox = 0;
        }
    }

    public class InhaltList
    {
        //Leere Liste erzeugen in der ComboBoxen abgelegt werden können(Damit diese später gehändelt werden können)
        private List<ComboBox> listComboBox = new List<ComboBox>();

        //Zählvariable um die ComboBoxen zu identifizieren zu können
        private int idComboBox = 0;
        //Property, welches eine referenz von idComboBox setzt und liest
        public int IdComboBox { get => idComboBox; set => idComboBox = value; }

        //Konstruktor
        public InhaltList()
        {
            //hier muss nichts gemacht werden. Es sei denn man möchte was übergeben
        }

        public InhaltList(int startIndexListe)
        {
            //möglich wäre eine Id Vorzugeben mit der gesartet werden soll.
            this.idComboBox = startIndexListe;
        }

        public ComboBox CreateComboBox(int x, int y)
        {
            //Grundeigenschften festlegen
            ComboBox comboBox = new ComboBox();
            comboBox.FormattingEnabled = true;
            comboBox.Location = new System.Drawing.Point(x, y);
            comboBox.Name = "comboBox" + idComboBox;
            comboBox.Size = new System.Drawing.Size(121, 21);
            comboBox.TabIndex = idComboBox;

            //Event erzeugen, was beim auswählen eines Items passiert
            comboBox.SelectedIndexChanged += ComboBox_SelectedIndexChanged;

            //ComboBox mit in die Liste aufnehmen
            listComboBox.Add(comboBox);

            //Id erhöhen
            idComboBox++;

            //ComboBox zurück geben
            return comboBox;
        }

        public ComboBox CreateComboBoxWithItems(int x, int y)
        {
            //Erzeuge mit der ersten Methode eine ganz normale Combobox
            ComboBox comboBox = CreateComboBox(x, y);
            //Füge einträge in diese ComboBox ein
            AddDefaultItems(comboBox);
            //Gebe die Combobox zurück
            return comboBox;
        }

        public void ComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            // Mach was beim Ändern
            //Achtung wird beim Ändern aller Comoboxen aufgerufen

            //Combobox Casten
            ComboBox comboBox = (ComboBox)sender;

            //nur bei der zweiten ComboBox ausführen
            if (comboBox.Name.Equals("comboBox1"))
                MessageBox.Show("Glückwunsch, Sie haben die ComboBox 2 erwischt (index 1)", "Glückwunsch");

            //Ausgabe der Änderung, als Beispiel was man alles für Daten bei dem Event abgreifen kann
            MessageBox.Show("SelectedIndexChanged von " + comboBox.Name + " auf index: " + comboBox.SelectedIndex.ToString() + "(" + comboBox.Items[comboBox.SelectedIndex].ToString() + ")", "Info");
        }

        public void AddDefaultItems(ComboBox comboBox)
        {
            //Füge Einträge auf die referenzierte ComboBox ein
            comboBox.Items.Add("Eintrag1");
            comboBox.Items.Add("Eintrag2");
            comboBox.Items.Add("Eintrag3");
        }

        public List<ComboBox> GetAllComboBox()
        {
            return this.listComboBox;
        }
    }
}

Gruß Thomas

T
Tommylik Themenstarter:in
51 Beiträge seit 2019
vor 4 Jahren

Hallo Thomas,

Woooow das hätte ich jetzt nicht gedacht. Was für ein Code und so lang.
Dafür hätte ich Monate gebraucht wenn überhaupt. Spitze Vielen Dank.

Sorry für die verspätete Antwort. Ich war auf einem Workshop.
Und da ich schon aufgeben hatte bin ich nicht davon ausgegangen das mir
einer von Euch einen fertigen Code präsentiert.
Super Vielen vielen Dank dafür.

Ich sehe das du schon fast 7 Jahre dabei bist.
Wie lange hast du gebraucht das so zu können?

Bitte gehe weg von dem Static.

Das ist Gewohnheit von der SPS. Ich nutze gerne Statische Variabeln weil man
Sie besser beobachten kann. Aber gut werde ich mir merken.

So dann werde ich in den nächsten Tagen dein Code mal unter die Lupe nehmen.

Ich bin dabei das Buch von Kopf bis Fuß zu lesen. Ich hoffe das es das richtige
Buch für mich ist. Sieht nicht nicht so trocken aus eher amüsant.

Ach ja dieser Link http://www.guidetocsharp.de/ von Euer Buchempfelungs Seite ist tot.

Und ihr habt recht!!
[Hinweis] Wie poste ich richtig?

1.1 Erst suchen und in die Doku schauen, dann posten

Wenn ich das als erstes gemacht hätte dann hätte ich herausgefunden das ich
Comboboxen nur auf der Form benutzen kann. Ich muss aber noch eine Grafik
einfügen und das geht nur mit einer PictureBox. Auf einer PictureBox kann man
aber keiner Comboboxen positionieren.

Blöde gelaufen. Und Sorry für die falsche Vorgehensweise.

So vielen Dank nochmal für den Code Super Arbeit von dir.

Mfg Tom