myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: Windows-Forms » Wie kann ich eine Variable einer WinForm an eine andere Form übergeben?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Wie kann ich eine Variable einer WinForm an eine andere Form übergeben?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Suspekta
myCSharp.de-Mitglied

Dabei seit: 24.08.2020
Beiträge: 12
Entwicklungsumgebung: Visual Studio


Suspekta ist offline

Wie kann ich eine Variable einer WinForm an eine andere Form übergeben?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Forum,

ich entschuldige mich schon mal für die wahrscheinlich blöde Frage aber ist es möglich eine WinForm als Variable an eine andere Klasse zu übertragen und auf diese dann zugreifen zu können.

Also ich habe eine Form mit Namen Hauptform und eine Klasse SL mit einer Methode SetztenText:
Diese Variante funktioniert. Aufruf aus Hauptform

C#-Code:
SL.SetztenText(this);

Klasse SL

C#-Code:
static class SL
{
public static void SetztenText(Hauptform formular)
        {
            formular.textbox1.text="Hallo";
        }
}

...............................................
Das funktioniert nicht ...

C#-Code:
static class SL
{
public static void SetztenText(Form formular)
        {
            formular.textbox1.text="Hallo";
        }
}

er kennt in formular die Textbox nicht ...

Der Grund für die Klasse und der Methode ist, dass ich diese aus verschieden WinForms aufrufen möchte. Es gibt also nicht nur die "HauptForm", sonder auch Form2, Form2 etc.

Danke
02.09.2020 12:28 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.280
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

"Funktioniert nicht" ist keine Fehlermeldung, siehe  [Hinweis] Wie poste ich richtig?
Hier ist es aber offensichtlich, dass es in einem Compiler-Error enden muss.

Aber ja, so funktioniert das einfach nicht, da Form einfach eine Klasse ist und nicht jede Form einfach Deine Textbox hat.
Das würde nur funktionieren, wenn Du die Ableitung (also Deine Klasse Hauptform, die von Form erbt) verwendest.
Weiterhin muss dazu die Textbox als öffentliche Eigenschaft hinterlegt sein, was sie wahrscheinlich nicht ist bzw. der Designer so standardmäßig nicht erstellt.

C#-Code:
public class HauptForm : Form
{
   public TextBox TextBox1 {get; set;} // set vermutlich private, kenne Deine Anwendung nicht
}

Aus Architektursicht wäre es aber besser, wenn Du Dir daraus eine generische Umgebung schaffst, damit Du die TextBox nicht exposen musst.

C#-Code:
public interface IMyDefaultForm
{
    void SetMaintext(string text);
}
public class HauptForm : Form, IMyDefaultForm
{
   private TextBox _textBox1; // vermutlich macht der Designer das so als default

   public void SetMaintext(string text) => _textBox1.Text = text;
}
public static void SetztenText<TForm>(TForm form) where TForm : IMyDefaultForm
        {
            form.SetMaintext("Hallo");
        }

Zitat:
Der Grund für die Klasse und der Methode ist, dass ich diese aus verschieden WinForms aufrufen möchte. Es gibt also nicht nur die "HauptForm", sonder auch Form2, Form2 etc.

Riecht so formuliert nach einer bösen Architekturverletzung.
Man übergibt eigentlich nicht bzw. nur in sehr wenigen Fällen ein UI-Objekt quer durch den Quellcode.

 [Artikel] Drei-Schichten-Architektur

Erklär mal was Du wirklich vorhast, dann kann man Dir sagen, wie man es richtig macht.
02.09.2020 12:35 Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.768
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

so funktioniert die objektorientierte Programmierung nicht.
Deine erste Methode liefert einen Fehler, weil textbox1 ein privater Member der Klasse Hauptform ist und deine zweite Methode kann generell nicht funktionieren, weil die Basisklasse Form keinen Member textbox1 enthält.

Du müßtest mit einer eigenen Form-Basisklasse oder einer Schnittstelle (interface) arbeiten, welche die Textzuweisung durchführt.

Lies dir auch mal in Ruhe die Artikel  [FAQ] Kommunikation von 2 Forms bzw. meinen eigenen Artikel dazu  Kommunikation von 2 Forms durch.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Th69 am 02.09.2020 12:44.

02.09.2020 12:42 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Suspekta
myCSharp.de-Mitglied

Dabei seit: 24.08.2020
Beiträge: 12
Entwicklungsumgebung: Visual Studio

Themenstarter Thema begonnen von Suspekta

Suspekta ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi,

erstmal danke für deine Antwort.
Die Textbox steht auf "Modifieres Public"

Ich habe in einem Projekt 15 WinForm, alle haben eine Textbox1 und weitere Elemente.
Jetzt möchte ich nicht für jede WinForm eine eigene Methode in der SL Klasse erstellen

In VB kann man z.B. die WinForm als Object übergeben und darüber auf die WinForm zugreifen (Der Compiler nimmt das bei VB einfach hin) und rennt erst bei Laufzeit auf einen Fehler, wenn die Form das angesprochene Objekt nicht hat.

Was mir eingefallen ist, man könnte den Namen des WinForm als String an die Methode übertragen und dann mit einem IF Anweisung arbeiten. Finde ich aber umständlich

Also was:

C#-Code:
static class SL
{
public static void SetzenText (String name)
{
if (name=="Hauptform")
{
HauptForm.textbox1.text="sdfsd";
}

if (name=="Form2")
{
Form2.textbox1.text="sdfsd";
}

}
}
02.09.2020 12:51 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.280
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat:
Ich habe in einem Projekt 15 WinForm, alle haben eine Textbox1 und weitere Elemente.
Jetzt möchte ich nicht für jede WinForm eine eigene Methode in der SL Klasse erstellen

Ja, dann hast Du einfach die Objekt-orientierte Programmierung noch nicht so ganz verstanden :-)

Hättest Dir einfach eine Basis-Klasse machen können, die die Textbox hat, und davon erben.

C#-Code:
public abstract class MyBaseForm : Form ....
public class HauptForm : MyBaseForm ...

Zitat:
Der Compiler nimmt das bei VB einfach hin

Gut, dass wir mit C# ne ordentliche Sprache haben, die typisiert ist und sowas nicht einfach hinnimmt ;-)
VB ist im Gegensatz zu VB.NET und C# auch eine non-object-basierte Sprache.
02.09.2020 12:53 Beiträge des Benutzers | zu Buddylist hinzufügen
Suspekta
myCSharp.de-Mitglied

Dabei seit: 24.08.2020
Beiträge: 12
Entwicklungsumgebung: Visual Studio

Themenstarter Thema begonnen von Suspekta

Suspekta ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat:
Ja, dann hast Du einfach die Objekt-orientierte Programmierung noch nicht so ganz verstanden :-)

Ja das gebe ich zu ^^

Zitat:
Gut, dass wir mit C# ne ordentliche Sprache haben, die typisiert ist und sowas nicht einfach hinnimmt ;-)
Hättest Dir einfach eine Basis-Klasse machen können, die die Textbox hat, und davon erben.

Darum versuche ich mir gerade C# beizubringen :)

Vielleicht brauche ich doch mal einen Grundkurs ...
02.09.2020 13:04 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
JimStark
myCSharp.de-Mitglied

avatar-1005.jpg


Dabei seit: 10.03.2020
Beiträge: 121
Entwicklungsumgebung: Visual Studio 6.0 Enterprise


JimStark ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Man könnte es ja auch z.B. so machen:

C#-Code:
    public static class Form1ErweiterungMethod
    {
        public static void SetText(this Form1 form, string title)
            => form.Text = title;
    }

Würde da dagegen was sprechen, bzw. was wäre daran der Nachteil gegenüber einer Ableitung? @Abt, Th69,...

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von JimStark am 02.09.2020 13:09.

02.09.2020 13:07 Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.280
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Jim, das hat ja nichts mit der Textbox zutun, die sich auf der Form befindet.
Bringt ihm also nichts.

Daher entsprechend mein Beispiel mit der Methode über das Interface; alternativ direkt auf die Textbox einer Basis-Klasse.
02.09.2020 13:11 Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.768
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ja, das würde mit dem Titel (Form.Text) funktionieren, aber eben nicht mit auf beliebigen Forms platzierten Elementen mit zufällig gleichen Namen (wie z.B. textbox1).
Darum ja der Hinweis auf eine Basisklasse (bzw. -interface).

Edit:
@Suspekta: Du solltest wirklich ein Grundlagenbuch zu C# und OOP durcharbeiten, z.B. das hier bei den "Ressourcen" verlinkte Open-Book  Visual C# (2012) (Die Grundlagen gelten nach 8 Jahren immer noch ;-)

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Th69 am 02.09.2020 13:17.

02.09.2020 13:11 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
JimStark
myCSharp.de-Mitglied

avatar-1005.jpg


Dabei seit: 10.03.2020
Beiträge: 121
Entwicklungsumgebung: Visual Studio 6.0 Enterprise


JimStark ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Achso sorry hatte seine Frage nicht verstanden
02.09.2020 13:15 Beiträge des Benutzers | zu Buddylist hinzufügen
chilic
myCSharp.de-Poweruser/ Experte

Dabei seit: 12.02.2010
Beiträge: 2.050


chilic ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat:
Was mir eingefallen ist, man könnte den Namen des WinForm als String an die Methode übertragen

Das funktioniert solange bis du dein Form umbenennst. Dann findet der Vergleich der Namen nichts mehr und du suchst und suchst...

Noch ein offtpoic Hinweis zu deinem Methodennamen SetzenText.
Wenn du deutsche Bezeichner willst, verwende welche.
Wenn du englische Bezeichner willst, verwende welche.
Aber verwende doch keine deutsch klingenden nicht-deutschen Bezeichner ;-)

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von chilic am 03.09.2020 07:48.

03.09.2020 07:46 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ErfinderDesRades
myCSharp.de-Poweruser/ Experte

avatar-3151.jpg


Dabei seit: 31.01.2008
Beiträge: 5.290


ErfinderDesRades ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Du könntest eine Methode SetzenText(Textbox tb) schreiben.

C#-Code:
static class SL
{
public static void SetztenText(Textbox tb)
        {
            tb.text="Hallo";
        }
}

Aufzurufen:

C#-Code:
SL.SetztenText(this.texbox1);

Das würde von jedem Form aus gehen (ob sowas sinnvoll ist sei dahingestellt)
14.09.2020 21:57 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als ein Monat.
Der letzte Beitrag ist älter als ein Monat.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 20.10.2020 08:29