Laden...

Information zwischen 2 Forms

Erstellt von Franklin vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.176 Views
F
Franklin Themenstarter:in
56 Beiträge seit 2010
vor 13 Jahren
Information zwischen 2 Forms

Hallo Leute,

Mit c# kenne ich mich noch nicht so gut aus.
Muss ein Projekt für die schule mache.

ich habe 2 forms. Das einte ist die oberfläche zur steuerung des Roboters. das 2. form sind die einstellung wie com port etc.

wie kann ich nun die daten von den listbox und textbox aus dem 2. form in das erste übernehmen?!

im VB ist das ja sehr eifach aber hier bekomme ich das irgendwie nicht hin...

danke für die Hilfe...

5.742 Beiträge seit 2007
vor 13 Jahren

Hallo Franklin,

siehe [FAQ] Kommunikation von 2 Forms

im VB ist das ja sehr eifach aber hier bekomme ich das irgendwie nicht hin...

Da spare ich mir jetzt mal den Kommentar :evil:

61 Beiträge seit 2009
vor 13 Jahren

Hallo Franklin,

mir fallen da folgende Möglichkeiten ein:

1. Form1 an Form2 übergeben - geringer Aufwand
Einfach einen 2. Konstruktor schreiben, der die entsprechende Form annehmen kann.
Der Konstruktor sollte so aussehen:


     public class Form2
     {
          // Standardkonsturktor nicht verändern, dient dem Designer
          public Form2()
          {
               InitializeComponent();
          }

          // Das ist der neue Konstruktor
          public Form2(Form1 form)
               : this() // damit wir der obere Konstruktor mit aufgerufen
          {
               this.form1 = form;
          }

          private Form1 form1;

          // ...
     }

Dann müsste man nur noch die Werte angleichen, je nachdem was du erreichen möchtest.

2. Interfaces benutzen - etwas aufwendiger, aber nützlicher
Interfaces brauch man eigentlich erst, wenn man auf verschiedenen Objekten dieselben Aktionen ausführen möchte. Aber statt die ganze Form zu übergeben (und am Ende noch die Modifer für die ListBox und die TextBox auf "public" zu stellen, empfehle ich Interfaces. Auf diesen Weg kann man die Zuweisung der Daten für die Controls auf Form1 besser steuern.

Im Prinzip übergibt man dann noch immer die Form1 über den Konstruktor (siehe oben). Aber anstatt den Datentyp bei Form1 zu belassen, ändert man ihn auf z.B. IForm1.

Das Interface richtet sich danach, was für Daten man übergeben möchte.
Wenn du nur mit der ListBox.DataSource-Eigenschaft und der TextBox.Text-Eigenschaft arbeitest, dann könnte das mit dem Interface so aussehen:

EDIT: kleine Korrektur am Code 😉


     interface IForm1
     {
          string TextBox1_Text { get; set; }
          object ListBox1_DataSource { get; set; }
     }

     pubic class Form1 : IForm1
     {
          public Form1()
          {
               InitializeComponent();
          }

          // ...

          string IForm1.TextBox1_Text
          {
               get { return this.textBox1.Text; }
               set { this.textBox1.Text = value; }
          }

          object IForm1.ListBox1_DataSource
          {
               get { return this.ListBox1.DataSource; }
               set { this.ListBox1.DataSource = value; }
          }
     }

andere Möglichkeiten sind Events von den Controls von Form2 in der Form1 zu verarbeiten und noch viele mehr...

Vielleicht konnte ich dir ja weiterhelfen 😉

In der Zeit vor fünf Minuten ist Jetzt die Zukunft. Jetzt ist die Gegenwart. Die Zeit, in der ich zu erzählen begonnen habe, ist die Vergangenheit von Jetzt und die Zukunft von der Gegenwart der Zeit, fünf Minuten bevor ich zu erzählen begann.

Gelöschter Account
vor 13 Jahren

3. du machst das sauber und trennst datenhaltung von GUI und übergibst nur das datenhaltungsobjekt an die 2. form.

F
Franklin Themenstarter:in
56 Beiträge seit 2010
vor 13 Jahren

hey ruben,
danke für die hilfe,
kannst du mir das mit dem interface ein bisschen näher erklären.

also was muss ich genau machen.

ich will die zahl aus der listbox was den COMPort von der Form2 in ein Lable schreiben was sich in Form1 befindet.

Ich habe es so probiert.

        public string variable;

        public Settings()
        {
            InitializeComponent();

            this.variable = listBox2.Text;

        }

auf Form 2

        private void button8_Click(object sender, EventArgs e)
        {
            GetVauleFromForm2();
        }
        private void GetVauleFromForm2()
        {
            Settings frm2 = new Settings();
            label4.Text = frm2.variable;
        }

auf Form1 mit dem Click auf den Button die eingestelle werte abholen.

es funktioniert wenn ich die variable auf dem Form2 als feste definiere. also "hallo" oder so...
aber wiso nicht wenn ich was in der listbox auswähle?!?

Gelöschter Account
vor 13 Jahren

bitte beachte [Hinweis] Wie poste ich richtig? punkt 1

du erstellst immer eine neue instanz... das kann nciht gehen aber dieses wissen setzen wir als bekannt vorraus.

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Ruben,

ich begrüße es ausdrücklich, dass du hier nach Kräften versuchst du helfen. Leider ist gut gemeint nicht unbedingt gut gemacht. Mal abgesehen davon, dass es ziemlich unsinnig und auch unerwünscht ist, Fragen ausführlich im Thread zu beantworten, wenn sie schon in der FAQ schon ausführlich beantwortet sind, sind deine beiden Hauptvorschläge sehr, sehr schlechter Stil. Vorschlag eins verstößt gegen die Regel, dass Form2 (im Dienste der Entkoppelung und Wiederverwendbarkeit sowie der Vermeidung von Ringabhängigkeiten) nie Form1 kennen sollte (was auch nie nötig ist). Dies mit einem Interface zu vermeiden, ist ebenfalls nur gut gemeint, aber mehr als unpraktisch. Jeder Benutzer von Form2 muss dann immer noch unnötigerweise das Interface implementieren. Die eigentliche Lösung hast du nur ganz, ganz kurz angerissen. Events. Kein Wunder, dass sich Anfänger bei diesem Ungleichgewicht erstmal auf den schlechten Code stürzen und sich ein falsches Vorgehen angewöhnen. Solche Antworten schaden also mehr als sie nützen. Da du in letzter Zeit schon mehrfach daneben gelegen hast (wenn auch nicht so krass wie hier) würde ich mich freuen, wenn du nur noch antwortest, wenn du dir sicher bist, dass deine Antwort korrekt und angemessen ist.

Hallo Franklin,

bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1.1. Es ist nicht erlaubt, Fragen zu stellen, die sich nicht stellen, wenn man sich vorher in C# und Windows Forms eingelesen hat. Du hast bereits mehrere solche Fragen gestellt. Das muss bitte aufhören. Beschäftige dich stattdessen bitte zunächst mit [FAQ] Wie finde ich den Einstieg in C#?.

herbivore