Autor Beitrag
Azzidodabass
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: So 23.11.08 19:16 
Hallo nochmal!!!

Kurze Frage, wie kann ich bei 2 formularen mit je einem label (also label1 auf Form1 und label1 auf Form2 )
dem einen label auf knopfdruck den wert des anderen labels zuweisen.

ausblenden C#-Quelltext
1:
2:
3:
4:
private void button1_Click(object sender, EventArgs e)
        {
         form2.label1.text = form1.label1.text;   
        }


das klappt leider nicht!!

Danke schonmal für die antwort

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
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 23.11.08 20:08 
user profile iconAzzidodabass hat folgendes geschrieben Zum zitierten Posting springen:
das klappt leider nicht!!

Das ist keine aussagefähige Problembeschreibung. Bitte denke künftig daran, dass Du beschreibst, was und wie nicht funktioniert.

Aber in dieser Situation sind mehrere Punkte klar:

1. Du musst die Zugriffsberechtigung berücksichtigen: public, private u.a. Ein Control ist grundsätzlich private, ist also "von außen" nicht zugänglich.

2. Wenn sich button1 in Form1 befindet, darfst Du nicht den Variablennamen form1 verwenden, sondern direkt label1 (allenfalls this.label1).

3. In aller Regel kennen zwei Formulare sich nicht. Allenfalls ist das eine Formular (Form2) abhängig vom anderen (Form1), aber nicht umgekehrt. Du kannst also höchstens von Form1 auf form2 zugreifen. Außerdem musst Du aufpassen mit der Bezeichnung der Klasse und der konkreten Instanz.

4. Du benötigst dafür eine public-Methode oder eine Eigenschaft in Form2, mit der Du von Form1 aus etwas erledigst:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
//  in Form2
public void SetLabelText(string value) {
   this.label2.Text = value;
}

//  in Form1
form2.SetLabelText(this.label1.Text);


5. Für die Übergabe von Form2 auf Form1 solltest Du den "richtigen" Weg über Delegates gehen. Aber das ist komplizierter.

6. Bitte fang mit vernünftigen Bezeichnern an. Form1 und Form2 sind keine Namen, die etwas aussagen.

Hast Du Dich eigentlich schon mit einführender Literatur befasst? OpenBook VC#

Viele Hinweise gibt es auch durch [url=www.mycsharp.de/wbb2...d.php?threadid=5960]
[FAQ] Kommunikation von 2 Forms[/url] und die dortigen Verweise.

Jürgen
Azzidodabass Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: Mo 24.11.08 09:34 
Danke für die schnelle Antwort.
Was mich wundert ist, dass es so abwägig ist, dass sich 2 oder mehrere formulare kennen.
In jedem kleineren WIndows Programm ist es doch so, dass sich oben im Menüstrip mehrere Punkte befinden, wie z.b. Einstellungen, bei dem sich ein formular öffnet, das informationen mit dem hauptformular austauscht.

Wie wird sowas gelöst???
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 24.11.08 10:54 
Hallo,

da hatte ich etwas zu knapp formuliert.

Form1 kennt Form2 "im Prinzip", d.h. es hat Zugriff auf das Formular insgesamt (traditionell: es kennt einen Zeiger auf das Objekt), aber es hat keine Kenntnis von den Details. Als Schnittstelle werden Eigenschaften oder Methoden verwendet. Vorteil ist es u.a.: Wenn Du später den Aufbau von Form2 änderst (und seien es nur die Namen der Controls) und direkten Zugriff auf die einzelnen Controls hast, musst Du auch Form1 ändern. Wenn Du aber die Schnittstelle unverändert lässt, kannst Du Form2 nach Belieben neu gestalten, und die Zusammenarbeit mit Form1 klappt weiterhin.

Das ist ein Grundprinzip der OOP: Eine Klasse hat nur über fest definierte Schnittstellen Zugriff auf eine andere Klasse. (Und Formulare sind ja auch nur Klassen.)

Konkret: In meinem Punkt 4 habe ich eine Methode SetLabelText angegeben, die einen bestimmten Wert an Form2 übergibt. Genauso kann man über eine Methode mehrere Werte übergeben, die von Form2 passend verarbeitet werden. Ebenso kann man über eine Methode GetLabelText einen Wert abholen. Oder über eine Eigenschaft kann ein Wert gezielt festgelegt oder abgefragt werden, wie es z.B. der OpenFileDialog mit FileName macht.

Ich hoffe, ich habe das Prinzip etwas verdeutlichen können. Weitere Einzelheiten findest Du in dem angegebenen Link [FAQ] Kommunikation von 2 Forms.

Jürgen
Azzidodabass Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: Mo 24.11.08 15:21 
Danke für den haufen Arbeit.
Hast es mir sehr gut verdeutlicht!!

Eine Frage noch zu deinem geposteten code:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
//  in Form2  
public void SetLabelText(string value) {  
   this.label2.Text = value;  
}  

 
//  in Form1  
form2.SetLabelText(this.label1.Text);


in form1 erkennt er mir form2 nicht.
Muss ich die klasse über using erst einbinden????
obwohl die sich im gleichen namespace befindet???

Moderiert von user profile iconKha: C#-Tags hinzugefügt
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 24.11.08 15:49 
user profile iconAzzidodabass hat folgendes geschrieben Zum zitierten Posting springen:
in form1 erkennt er mir form2 nicht.
Muss ich die klasse über using erst einbinden????
obwohl die sich im gleichen namespace befindet???

Bei diesen Rückfragen bitte auf Groß- und Kleinschreibung achten, damit einem Leser klar ist, wann der Klassenname und wann die Instanz angesprochen wird (vor allem bei solch aussagefähigen Bezeichnern, die eigentlich verboten gehören).

Ich bin davon ausgegangen, dass form2 von form1 aus erzeugt wird; damit wäre es bekannt. Wenn das (noch) nicht gilt, musst Du es bekanntgeben. Der "eigene" Namespace wird nicht automatisch erweitert, sondern Du musst auch dafür die using-Direktive verwenden und auch ggf. eine Referenz auf eine andere Assembly hinzufügen.

Jürgen