1

C# Befehl von Form zu Form

Frage von Cedmeister Cedmeister

Guten Abend :)

Wie kann man von einer Form die Steuerelemente einer anderen ansteuern ?

Zum Programm: Hauptform hat eine listbox mit verschiedenen Einträgen. Es wird über einen Bearbeiten Button eine weiter Form aufgerufen, über die die Einträge der Box editiert werden können.

Wie kann man nun im Code der 2. Form die Befehle für die Listbox auf der 1. aufrufen ? Am besten objektorientiert!

Fragen zu gleichen Themen finden

Antworten (3)

  • 0
    Hilfreichste Antwort ausgezeichnet vom Fragesteller
    Antwort von Michael339 Michael339

    Gut, halt mal ein schnelles Beispiel (bspw. ohne Prüfung, ob aus dem richtigen Thread auf die Controls zugegriffen werden), nur um EINE Lösung zu verdeutlichen:

    Form1 hat eine leere Listbox (listBox1) und einen Button (button1):

     public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Form2 _f2 = new Form2(this.listBox1);
                _f2.Show();
            }
        }
    

    Form2, in der auf die Listbox (ohne Prüfung etc) zugegriffen wird, indem die Listbox bzw. besser Referenz dem Konstruktor der Form2 übergeben wird:

    public partial class Form2 : Form
        {
            private ListBox _lb = null;
    
            public Form2()
            {
                InitializeComponent();
            }
    
            public Form2(ListBox form1Listbox)
                : this()
            {
                this._lb = form1Listbox;
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                if (!String.IsNullOrEmpty(this.textBox1.Text))
                {
                    this._lb.Items.Add(this.textBox1.Text);
                }
            }
        }
    

    Gibt weitaus mehr Möglichkeiten, wie man das von Dir geschilderte Problem lösen könnte, ist halt eine.

    Kommentar von Michael339 Michael339Michael339

    Für threadsicheren Aufruf daher noch bspw. folgendes beachten: http://blog.psychocoder.net/index.php/2010/07/03/extension-methods-invokerequired/

    Kommentar von DataJockey DataJockeyDataJockey

    Das ist eine sehr aufwendige Lösung.

    Wie von mir beschrieben die Sichtbarkeit auf public zu setzen ist zwar kein guter OOP-Stil, aber wesentlich einfacher. Wenn mans OOP machen will, kann man ja ne read-only Property drauf zeigen lassen. Aber wen interessiert's ....

    gruss, dj

    Kommentar von Michael339 Michael339Michael339

    Ich würde sogar so weit gehen und kühn behaupten, dass unsere beiden Vorschläge nicht korrekt sind. Die Modifier sollten nicht "aufgeweicht" werden und aus Form2 sollte nicht auf Form1 zugegriffen werden.

    Vielmehr sollte Form2 INotifyPropertyChanged implementieren und Form1 sollte Änderungen seiner Listbox selbst vornehmen, indem aus auf "PropertyChanged"-Ereignisse der Form2 reagiert. Ist noch komplizierter, aber der eher richtige Weg.

    Kommentar von DataJockey DataJockeyDataJockey

    ja, das waere natuerlich feinstes OOP. Aber OOP ist nicht immer elegant und/oder schnell. ;)

    Kommentar von Cedmeister CedmeisterCedmeister

    Danke für die ausführliche Antwort!

    Aber es kommt der Fehler:

    Fehler 1 "Projekt.Form2" enthält keinen Konstruktor, der 1-Argumente akzeptiert.

    Zur Aufklärung: Soll ein Geburtstagsplaner werden wo man selber Einträge erstellen, ändern und löschen kann.

    Kommentar von Michael339 Michael339Michael339

    So wie es aussieht (zumindest meine erste Vermutung), fehlt der Konstruktor "public Form2(ListBox form1Listbox): this()..." komplett oder aber der Konstruktor kann von Form1 nicht angesprochen werden, da er bspw. private ist. Wie sehen bei Dir im Projekt.Form2 die Konstruktoren aus?

    Kommentar von Michael339 Michael339Michael339

    Einen kleinen Hinweis muss ich mir dann noch erlauben: Wenn die Anwendung nur für Dich gedacht ist und niemand sonst den Quellcode zu sehen bekommt, ist's nicht weiter tragisch. Anderenfalls würde ich darauf achten, die Sichtbarkeit von Klassen, properties etc. entsprechend restriktiv zu setzen. Die von mir vorgeschlagene Lösung ist wie schon gesagt quick 'n dirty und eher für den privaten bzw. schnellen Einsatz gedacht. Wenn Du es besser machen willst, sollte vielleicht die Analogie des tatsächlichen Lebens eine Rolle spielen: Du würdest sicherlich Dein Smartphone mit dem Kalender (entspricht Form1 mit Listbox) nicht Deiner Freundin geben (entspricht Form2), damit diese neue Einträge in Deinem Kalender vornimmt. Die "Gewalt" über Deine Kalendereinträge sollte bei Dir (bzw. Form1) liegen. Vorstellbar ist doch bspw. dass Deine Freundin nicht nur neue Daten einträgt, sondern vielleicht auch durchstöbert und Einträge von Deinen Ex-Freundinnen liest ;-). Du weißt zwar in dem vorliegenden Fall, was die Form2 macht, aber das kann ja nicht immer gewährleistet werden, wenn man z.B. Bibliotheken von Dritten einbinden muss.

    Kommentar von Cedmeister CedmeisterCedmeister

    So hat nach ein wenig rumtüfteln geklappt. Vielen Dank für die super Hilfe! :)

    Hier mal der Code von Form2, Bearbeiten Button:

            private void cmdEdit_Click(object sender, EventArgs e)
            {
                if (!String.IsNullOrEmpty(this.txtNachnameNeu.Text))
                {
                    this._lb.Items.Add(this.txtNachnameNeu.Text + ", " + this.txtVornameNeu.Text + ", " + this.txtGeburtstagNeu.Text);
                    this._lb.Items.Remove(this._lb.SelectedItem);
    
                    System.IO.StreamWriter _fs = new System.IO.StreamWriter(@"C:\Users\durau\Documents\Visual Studio 2010\Projects\Geburtstagsliste\liste.txt");
                    for (int i = 0; i < this._lb.Items.Count; i++)
                    {
                        _fs.WriteLine(this._lb.Items[i].ToString());
                    }
                    _fs.Close();
                }
    
                //Die Form schließen 
                this.Close();
    
  • 0
    Antwort von DataJockey DataJockey

    Eigenschaften der Listbox:

    GenerateMember : True (sorgt dafür dass eine Variable für die Listbox angelegt wird)

    Modifiers : Public (versieht die Variable mit Sichtbarkeit Public)

    Gruss, dj

  • 0
    Antwort von Michael339 Michael339

    Mit Binding (bspw. http://msdn.microsoft.com/de-de/library/ms229614.aspx) oder Listener oder nur Übergabe des selektierten Wertes... Wobei ich letzten Satz tatsächlich nicht verstehen "Befehle für die Lisgbox auf der 1. aufrufen"? Was willst Du dann noch aufrufen?

    Kommentar von Cedmeister CedmeisterCedmeister

    Einfach die Einträge der Listbox auf Form1 durch den String von Textboxen auf Form 2 ändern ^^

Diese Frage

Verwandte Fragen

Noch nicht den richtigen Rat gefunden?

Einfach und schnell viele hilfreiche Ratschläge von Deutschlands aktivster Ratgeber-Community erhalten!

Einfach und schnell einen Tipp erstellen und Ihren guten Rat mit anderen teilen!

Einfach und schnell ein Video hochladen und anschaulichen Rat an alle geben!

Die unter gutefrage.net angebotenen Dienste und Ratgeber Inhalte werden nicht geprüft. Die Richtigkeit der Inhalte wird nicht gewährleistet. Rechtliche Hinweise finden Sie hier.