mikrocontroller.net

Forum: PC-Programmierung c# Daten zwischen zwei Forms austauschen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: grundschüler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
       private void sub_aufruf_form2(int lvct) {
            int ct = LVx[lvct].SelectedIndices[0];
            Globals.global_text = LVx[lvct].Items[ct].SubItems[5].Text;
            Globals.global_konto = LVx[lvct].Items[ct].SubItems[1].Text;
            Globals.global_betrag = LVx[lvct].Items[ct].SubItems[3].Text;
            Globals.global_datum = LVx[lvct].Items[ct].SubItems[4].Text;
  
            Globals.global_f2_save = false;
             Globals.global_LV_Zeiger = lvct;

            Globals.lvi = LVx[lvct].Items[ct];
            //string abfr=Globals.lvi.SubItems[1].Text;


            
            
            

          Form2 dlg = new Form2();
             dlg.ShowDialog();
 
        }


hallo,

schreibe gerade ein Buchhaltungsprogramm. Problem: Es soll eine 
(Unter-)Form2 aufgerufen werden, die Listview-Daten in Form1 bearbeitet.
Es funktioniert mit Globals - finde ich aber sehr umständlich. Wie kann 
ich Daten von Form1 einfach in Form2 übernehmen?

danke

Autor: c.m. (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Du packst deine Daten in eine eigene Klasse (am besten mit gettern und 
settern), und übergibst der zweiten Form eine Objektreferenz der 
Instanz.

Autor: Michael A. (micha54)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

...indem Du eine Prozedur New(sometype subdata) definierst, die
dann die Daten übernimmt.

       private void sub_aufruf_form2(int lvct) {
            int ct = LVx[lvct].SelectedIndices[0];

           Form2 dlg = new Form2(LVx[lvct].Items[ct].SubItems);
             dlg.ShowDialog();

        }

public void Sub New(sometype subdata) {
     Text_feld.text = subdata[5].Text;
     Konto_feld.text = subdata[1].Text;
     Betrag_feld.text = subdata[3].Text;
     Datum_feld.text = subdata[4].Text;
}


Den genauen Typ somedata sagt Dir Dein Objektkatalog, irgendwas wie 
ListViewRow vermutlich oder Object(). C# ist nicht meine Sprache, lesen 
ist ok, denken eher nicht.

Gruß,
Michael

Autor: Michael A. (micha54)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
c.m. schrieb:
> Du packst deine Daten in eine eigene Klasse (am besten mit gettern und
> settern), und übergibst der zweiten Form eine Objektreferenz der
> Instanz.

Das lag mir auch erst im Hinterkopf, aber ich komme von vb.net, und da 
sind Setter und Getter extrem langatmig (Schreibaufwand). Ich sehe aber, 
dass C# hier deutlich optimiert ist :-)

Gruß,
Michael

: Bearbeitet durch User
Autor: DPA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eventuell mal MVC und MVVM anschauen, und ein Konzept auswählen?

Autor: grundschüler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für die Antworten. Hilft aber nicht wirklich weiter. Liegt aber 
vielleicht an meinen beschränkten c#-Kenntnissen. Ich will in form2 eine 
Referenz auf form1.listview1 um die Daten in  form1.listview1 direkt aus 
form2 heraus zu ändern. In vb geht das. Müsste in c# also auch gehen?

Autor: Ralf B. (spacerx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du Übergibst das Object der Daten an den Dialog.

Form2 dlg = new Form2();

dlg.SetObject(LVx[lvct]);

dlg.ShowDialog();


Die ganzen Abfragen von LVx machst dann im Dialog.

void SetObject(object)
{
  int ct = object.SelectedIndices[0];


}

Autor: grundschüler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralf B. schrieb:
> Du Übergibst das Object der Daten an den Dialog.

Genau das wäre es, was ich erreichen möchte. bei


Form2 dlg = new Form2();
dlg.SetObject(LVx[lvct]);

kommt eine Fehlermeldung - ...keine Definition für SetObject

Dann kommt ein icon
"Optionen für das Generieren eines Methodenstubs"
anklicken und die Fehlermeldung ist weg...

(Von einem Methodenstubs habe ich noch nie etwas gehört. Woher soll man 
so was wissen?)

Jedenfalls wird in form2 generiert:
      internal void SetObject(ListView listView)
        {
            throw new NotImplementedException();
        }

Fehlermeldung:
Methode nicht implementiert...


Da schreibe ich jetzt

 int ct = object.SelectedIndices[0];

rein - warum?
geht leider auch nicht. bei object. kommt nur equals und referenceequals

hört sich schon mal gut an - wie mach ich die reference?

Autor: Torben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde dir das Publish Subscribe Design Pattern empfehlen, damit die 
beiden Forms entkoppelt bleiben. Wird zum Beispiel in Prism Framework 
benutzt (WPF C# Framework).

https://kudchikarsk.com/publish-subscribe-design-pattern-in-csharp/

Autor: Torben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man kann doch auf die Daten in der anderen Form jederzeit zugreifen wenn 
diese als public definiert sind.

Autor: grundschüler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
walter schrieb:
> public definiert

das ist die Fragestellung: wie wird form1 public???

Autor: walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der zugehörigen Formxyz.Designer.cs das gewünschte Element von privat 
auf public setzen.

Autor: grundschüler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
walter schrieb:
> Formxyz.Designer.cs


Versuch mit textbox1:
        public  System.Windows.Forms.TextBox textBox1;

keine Fehlermeldung - nur wie greife ich jetzt auf tb zu? 
form1.textBox1... geht leider nicht.

Autor: Dirk K. (merciless)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Anbei ein Minimal-Beispiel mit einem public Setter.
Einfach mal durchsteppen mit dem Debugger.

merciless

Autor: walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein eifaches Beispiel :

Ich habe eine Form2.
Darin: public string text2;

In Form1 z.B.
string text1 = "Beispiel";

Dann rufe ich aus Form1 Form2 auf :

        {
             Form2 form = new Form2();
             form.text2 = text1;
             form.ShowDialog();

        }

Damit wird der Stringinhalt nach Form2.text2 übertragen

Autor: walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
grundschüler schrieb:
> walter schrieb:
>> Formxyz.Designer.cs
>
> Versuch mit textbox1:
>         public  System.Windows.Forms.TextBox textBox1;
>
> keine Fehlermeldung - nur wie greife ich jetzt auf tb zu?
> form1.textBox1... geht leider nicht.

Bei als static deklarierten Methoden ist bei der Entwurfszeit kein 
Zugriff möglich.
Die Voreinstellung ist static.
static entfernen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.