Autor Beitrag
hagily
Hält's aus hier
Beiträge: 4



BeitragVerfasst: So 03.01.10 18:20 
Hallo.

In meinem Programm wird durch ein Button in frm1 eine Instanz von einem weiteren Form erstellt und das Form (frm2) angezeigt. Nun möchte ich den Inhalt einer Textbox in frm2 zurück an frm1 übergeben. frm1 ist ein UserControl und in ein weiteres form eingebunden.
Ich bin allerdings noch ein blutiger Anfänger und weiß nicht ob bzw wie das funktioniert. Ich weiß nur, dass es nicht funktioniert, wenn ich eine neue Instanz von frm1 erstelle und den Wert dorthin übergebe. Das ist ansich auch logisch, da ich den Inhalt der Textbox in der alten Instanz (die frm2 aufgerufen hat) haben möchte.

Wäre schön, wenn mir jemand auf die Sprünge helfen könnte.
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: So 03.01.10 21:23 
Hallo,

es gibt grundsätzlich zwei Möglichkeiten:

Bei der einfachen Variante hat frm1 die Kontrolle darüber, wann der Wert zurückgegeben wird (genauer: wann er geholt wird). Dabei wird von frm1 aus eine Eigenschaft von frm2 gezielt abgefragt, etwa so:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
// in Frm2
public string TextBoxText{  
  get { return myTextBox.Text; }
}

// in Frm1
string myValue = frm2.TextBoxText;

Bei der komplizierten (eigentlich schöneren) Variante hat frm2 die Kontrolle darüber, wann der Wert übergeben wird. Dabei wird von frm1 an frm2 ein Delegate übergeben; dieser wird innerhalb von frm2 aufgerufen. Darüber wirst du unter [FAQ] Kommunikation von 2 Forms mit vielen weiteren Verweisen ausführlich informiert.

Eine Notlösung erläutere ich nicht, weil sie dem Gedanken der OOP widerspricht: Keine Klasse darf Kenntnis oder gar Zugriff auf Interna einer anderen Klasse haben. (Diesen Hinweis gibt es vorsorglich für den Fall, dass jemand diesen miserablen Weg vorschlagen will.)

Übrigens gehören Namen wie Form1 oder Label23 verboten, siehe .NET Richtlinien für Namen. Auch ist ein Bezeichner wie frm1 für etwas, was kein Formular ist, äußerst missverständlich.

Gruß Jürgen
hagily Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mo 04.01.10 00:40 
Hallo!

[quote="user profile iconJüTho"(590170)]
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
// in Frm2
public string TextBoxText{  
  get { return myTextBox.Text; }
}

// in Frm1
string myValue = frm2.TextBoxText;


Diese Lösung erzeugt folgende Fehlermeldung:
An object reference is required for the non-static field, method, or property 'TextBoxText.get'
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mo 04.01.10 11:19 
user profile iconhagily hat folgendes geschrieben:
Diese Lösung erzeugt folgende Fehlermeldung:
An object reference is required for the non-static field, method, or property 'TextBoxText.get'

Wenn du nicht dazu schreibst, bei welcher Zeile in deinem Quelltext dieser Fehler auftritt, können wir nur raten. :roll:

Hast du etwa frm2 als Name der Klasse verwendet und nicht (wie deine Überschrift suggeriert) als Name einer "bereits geöffneten Instanz"? :oops: Deshalb sind die "Richtlinien für Namen" so wichtig und nützlich.

Oder ist es etwas anderes? Wenn du nicht weißt, wo der Fehler auftritt, dann setze einen Breakpoint und gehe manuell mit dem Debugger durch.

Eigentlich ist diese Fehlermeldung ganz eindeutig und kann nur von dir gelöst werden. Tipps dazu findest du auch unter [FAQ] Für das nicht statische Feld, die Methode oder die Eigenschaft "X" ist ein Objektverweis erf..

Jürgen