Entwickler-Ecke
C# - Die Sprache - Variable in einer bereits geöffneten Instanz ändern
hagily - So 03.01.10 18:20
Titel: Variable in einer bereits geöffneten Instanz ändern
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 - 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:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| public string TextBoxText{ get { return myTextBox.Text; } }
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 [
http://www.mycsharp.de/wbb2/thread.php?threadid=5960] 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 [
http://msdn.microsoft.com/de-de/library/ms229002(VS.80).aspx]. Auch ist ein Bezeichner wie frm1 für etwas, was kein Formular ist, äußerst missverständlich.
Gruß Jürgen
hagily - Mo 04.01.10 00:40
Hallo!
[quote="
JüTho"(590170)]
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| public string TextBoxText{ get { return myTextBox.Text; } }
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 - Mo 04.01.10 11:19
hagily 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. [
http://www.mycsharp.de/wbb2/thread.php?threadid=21723].
Jürgen
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!