# [C#] Textbox aus anderer Klasse füllen



## thelonegunman (25. November 2002)

Servus,

habe das Problem, dass bei den folgenden Quellcodes leider kein Zugriff auf die TextBox in MainForm möglich ist. Beide Klassen nutzen den gleichen namespace. 

Könnte mir eventuell mal jmd. helfen? 

Ich poste mal nur die interessanten teile. 

//Server.cs

using System;

namespace NSServer
{
	/// <summary>
	/// Zusammendfassende Beschreibung für Server.
	/// </summary>
	public class Server
	{
		public Server()
		{
                 MainForm.NSSLog.AppendText("Es klappt irgendwie");
                }
         }
}




// MainForm.cs


namespace NSServer
{
	/// <summary>
	/// Zusammendfassende Beschreibung für Form1.
	/// </summary>
	public class MainForm : System.Windows.Forms.Form
	{
		public System.Windows.Forms.TextBox NSSLog;


                private void InitializeComponent()
		{
			this.NSSLog = new System.Windows.Forms.TextBox();
			this.SuspendLayout();
			// 
			// NSSLog
			// 
			this.NSSLog.Location = new System.Drawing.Point(24, 16);
			this.NSSLog.Multiline = true;
			this.NSSLog.Name = "NSSLog";
			this.NSSLog.ReadOnly = true;
			this.NSSLog.Size = new System.Drawing.Size(520, 368);
			this.NSSLog.TabIndex = 0;
			this.NSSLog.Text = "";
			// 
			// MainForm
			// 
			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
			this.ClientSize = new System.Drawing.Size(568, 453);
			this.Controls.AddRange(new System.Windows.Forms.Control[] {
																		  this.NSSLog});
			this.Name = "MainForm";
			this.Text = "NetworkStart Server";
			this.ResumeLayout(false);

		}

}


Fehlermeldung ist folgendes: 

e:\wissen\eigene_Programme\csharp\NetworkStart\NSServer\Server.cs(22): Ein Objektverweis ist für das nicht statische Feld, Methode oder Eigenschaft 'NSServer.MainForm.NSSLog' erforderlich.


MfG TLGM


----------



## Christian Fein (25. November 2002)

Oehm natürlich hast du kein Zugriff auf eine nichtinstanzierte Klasse.

Eine Klasse muss Instanziert werden um einm nutzbares Object zu erhalten. 
Die Klasse selber ist nicht (static mal ausgeschlossen) nutzbar sondern nur eine Schablone nach der Objecte gebaut werden.

Dir das im Einzelnen hier zu erklären währe zu umfangreich. Bitte les den Teil mit Object Orientiertem Programmieren in deinem Buch durch.
Ohne dieses Wissen wirst du nicht vorrankommen.

Deine Form wurde schon instanziert.
das heisst du willst in deinem "seltsamen" Beispiel eine Instanz der Klasse Server die auf die Textbox der MainForm Klasse zugreift.

Das heisst du müsstest an Server eine Referenz von MainForm übergeben bei dder instanzierung.

Besser währe du übergibst bei der Instanzierung eine Referenz auf deine Textbox

Konstruktor Server:

public Server(TextBox refTBox)
{
this.TextBox = refTBox;
}

Bearbeiten der Textbox

 TextBox.AppendText("Es klappt irgendwie");


Instanzierung auf der Form
Server myServer = new Server(TextBox refBox);

Bitte les dir aber die Grundlegenden Konzepte von OOP nochmals durch


----------



## thelonegunman (26. November 2002)

Servus,

Also wenn ich ehrlich sein soll, dann dachte ich ja schon, dass ich zumindest ein bissl Ahnung habe. Aber leider ging das nicht einfach durch ein static vor die Textbox zu lösen wie das in Java möglich wäre  

Jedenfalls habe ich das wohl mittlerweile zum Laufen gebracht, indem ich die GUI über eine andere Klasse starte, aber jetzt bekomme ich eine ObjectDisposedException :-( 

Wenn mir dazu jetzt noch jmd. nen schlauen Tipp geben könnte wäre ich überaus dankbar 

MfG TLGM


----------



## Christian Fein (26. November 2002)

> _Original geschrieben von thelonegunman _
> *Servus,
> 
> Also wenn ich ehrlich sein soll, dann dachte ich ja schon, dass ich zumindest ein bissl Ahnung habe. Aber leider ging das nicht einfach durch ein static vor die Textbox zu lösen wie das in Java möglich wäre
> *



Das währe auch in Java eine miese lösung gewesen.
Statische Member ist bei C# im übrigen absolut gleich.

Dennoch beherzige mein Tip bitte.


----------



## Pinkerl (6. September 2004)

Bin ein relativ blutiger Anfänger, also entschuldigt meine dumme Frage, aber gibts da wirklich nix besseres?

Ich habe nun zB ein ähnliches Problem, mit einer C# MDI Anwendung.

Im Childfenster werden irgendwelche Aktionen ausgeführt, deren Status ich in einer Statusleiste, die aber im Parentfenster liegt ausgeben möchte. Ich habe dazu versucht, mir aus dem Text der private Statusleiste eine public string Eigenschaft zu basteln (hoffentlich erschlägt mich jetzt keiner), was soweit auch ganz gut klappte. Nur wie ich nun vom Child auf das Parentfenster zugreifen soll ist mir total schleierhaft.

Bisher dachte ich nicht, daß ich an so einem 08/15 Problem, welches ja ansich in jedem zweiten Programm vorkommt scheitern könnte.

Also wenn der Weg über eine Referenz auf die MainForm Instanz der einzige ist, dann wird er zumindest sehr oft verwendet, oder?


----------



## Kachelator (6. September 2004)

Öh, wie ist denn der Thread ins C/C++-Forum geraten? Gab es 2002 noch kein C#-Forum? Na egal.

@Pinkerl: Kannst du  dem "Child" im Konstruktor eine Referenz auf das Parent übergeben? Anders kenne ich es auch nicht. Beispielansatz:


```
class Kind
{
  Form m_Parent;
  Kind( Form parent )
  {
     m_Parent = parent;
  }

  void TuWas()
  {
    m_Parent.Text  = "Hallo Welt";
  }
}
```
Verstehst du, was ich meine?

Eine andere Möglichkeit wäre immer noch, mit Delegates  ein Event zu vereinbaren, dass das Child zu Verfügung stellt. Das Parentfenster könnte sich dann an das Ereignis hängen und so die nötigen Updateinfos bekommen.


----------



## Abbreviation (10. September 2004)

Hi,

kannst du mir das vielleicht noch mal für "rookies"   erklären:

Wenn ich einen Zeiger auf den parent hab, kann ich dessen publics benutzen und verändern? Einfach so? (Das wäre so klasse...  )

Und jetzt die richtig blöde Frage  : Ist das dann elegant? 

Danke!
Grüßle
Marei

PS: Bin leider nicht nur in C++ sondern im Programmieren allgemein nicht so helle...


----------



## Kachelator (10. September 2004)

> Wenn ich einen Zeiger auf den parent hab, kann ich dessen publics benutzen und verändern? Einfach so? (Das wäre so klasse...  )


 Ja, das geht. Das es elegant ist,  finde ich nicht. Das wäre eher die Verwendung von Delegates.

Was verstehst du denn nicht?


----------



## Abbreviation (12. September 2004)

Naja, ich versuche grad eine Klasse aus der anderen aufzurufen, und will, dass die einen bestimmten Pfad verwendet, der in der aufrufenden Klasse "herausgefunden" wird. Ich bin mir nur nicht so sicher, wie ich der Klasse das "am schönsten sagen" kann. (wenn ich es nicht in den Konstruktor schreiben will/kann/...)
(Und ich bin leider alles andere als programmier-erfahren...:-()

Edit: Ich schau mir das mit "Delegates" mal an, danke für den Tipp! 

Danke schön!

Marei


----------

