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


von grundschüler (Gast)


Lesenswert?

1
       private void sub_aufruf_form2(int lvct) {
2
            int ct = LVx[lvct].SelectedIndices[0];
3
            Globals.global_text = LVx[lvct].Items[ct].SubItems[5].Text;
4
            Globals.global_konto = LVx[lvct].Items[ct].SubItems[1].Text;
5
            Globals.global_betrag = LVx[lvct].Items[ct].SubItems[3].Text;
6
            Globals.global_datum = LVx[lvct].Items[ct].SubItems[4].Text;
7
  
8
            Globals.global_f2_save = false;
9
             Globals.global_LV_Zeiger = lvct;
10
11
            Globals.lvi = LVx[lvct].Items[ct];
12
            //string abfr=Globals.lvi.SubItems[1].Text;
13
14
15
            
16
            
17
            
18
19
          Form2 dlg = new Form2();
20
             dlg.ShowDialog();
21
 
22
        }
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

von c.m. (Gast)


Lesenswert?

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

von Michael A. (micha54)


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

von Michael A. (micha54)


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
von DPA (Gast)


Lesenswert?

Eventuell mal MVC und MVVM anschauen, und ein Konzept auswählen?

von grundschüler (Gast)


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?

von Ralf B. (spacerx)


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];


}

von grundschüler (Gast)


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?

von Torben (Gast)


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/

von Torben (Gast)


Lesenswert?


von walter (Gast)


Lesenswert?

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

von grundschüler (Gast)


Lesenswert?

walter schrieb:
> public definiert

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

von walter (Gast)


Lesenswert?

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

von grundschüler (Gast)


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.

von Dirk K. (merciless)


Angehängte Dateien:

Lesenswert?

Anbei ein Minimal-Beispiel mit einem public Setter.
Einfach mal durchsteppen mit dem Debugger.

merciless

von walter (Gast)


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

von walter (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.