Forum: PC-Programmierung C#: Daten zwischen Window und View durchreichen


von Zo R. (hsch1978)


Lesenswert?

Hallo,

für eine C# Anwendung möchte ich Daten von einem Window in ein View 
Fenster durchreichen. Wie kann dies in C# realisiert werden?


[Windows Form]
Daten erzeugen und mit einem Button zum entsprechenden Vew Fenster 
übermitteln

[View Form]
Daten von Windows Form erhalten und weiterverarbeiten

: Bearbeitet durch User
von Franko P. (sgssn)


Lesenswert?

Wird die View-Form vom Windows-Form erzeugt? Wenn ja, weisst du doch wie 
das View-Form heisst und du kannst da darauf zugreifen.
Wie sieht denn dein bisheriger Code dazu aus?

Gruß

von Hans K. (gamp)


Lesenswert?

Hallo,

was ist denn ein View Form? Soviel ich weiß, gibt es da keine 
Unterschiede zwischen Fenster und Fenster.
Messages-Boxen gibt es auch noch.

Jedes Fenster ist eine Fensterinstanz, welche in deinem Program 
instaziirt sind. Wenn du Daten von einer Instanz in die andere schieben 
möchtest, musst du nur den Inhalt der einen Instanz nur in die andere 
kopieren. Du könntest die Inhalte natürlich noch in deinem Program 
zwischenspeichern und dann kopieren.

Mit Databinding könntest du es noch etwas vereinfachen, aber da kann es 
unübersichtlich werden.

von Hans (ths23)


Lesenswert?

Zo R. schrieb:
> für eine C# Anwendung möchte ich Daten von einem Window in ein View
> Fenster durchreichen. Wie kann dies in C# realisiert werden?

Databinding ist Dein Freund. Am Anfang ist es zwar gewöhnungsbedürftig, 
aber wenn man es einmal verstanden hat funktioniert das sehr gut. DEr 
ganze Kram die Daten in irgendwelchen Variablen zwischenspeichern zu 
müssen entfällt damit. Sehr angenehm ist auch das es in beide Richtungen 
funktioniert.

von Zo R. (hsch1978)


Lesenswert?

Danke euch.

Das Tool ist aktuell zu groß um hier zu posten.
Es handelt sich um ein View und Window.
Ich brauche für den Anfang ein einfaches Beispiel, wo eine Textnachricht 
durchgereicht wird. Eventuell kann das Beispiel auch eine Datenbindung 
zeigen.

: Bearbeitet durch User
von Zo R. (hsch1978)


Lesenswert?

Vielen Dank für die weitere Hilfe.

von Gunnar F. (gufi36)


Lesenswert?

Zo R. schrieb:
> Ich brauche für den Anfang ein einfaches Beispiel, wo eine Textnachricht
> durchgereicht wird.

in der Hauptform ein event und delegate anlegen, die Klasse Eventargs 
beerben, nur mit einer Eigenschaft string "Message". Das Event löst du 
aus mit invoke new event und abonnierst im Zielform einen Eventhandler 
mit gleicher Signatur wie der delegate. Ganz einfach. Kann dir ChatGPT 
noch wesentlich eleganter erklären und auch gleich Snippets für 
copy&paste!

von Zo R. (hsch1978)


Lesenswert?

Guten Morgen, ChatGPD habe ich auch benutzt. Allerdings generiert mir 
ChatGPD ein Beispiel, das bei mir nicht so funktioniert.

Ich habe einen View:
1
namespace Config.Views
2
{
3
    public partial class FunctionsTelegramView : UserControl
4
    {
5
6
    }    
7
}

Und eien Windows:
1
namespace Config.Windows
2
{
3
    public partial class DataSelectionWindow : Window
4
    {
5
    }
6
}

Das Problem bei mir ist das es unterschiedliche Classes sind: 
UserControl und Window

: Bearbeitet durch User
von Zo R. (hsch1978)


Lesenswert?

Ich hab zwar in CHatGPD ein Beispiel generieren lassen, leider 
funktioniert das hinten und vorne überhaupt nicht.

: Bearbeitet durch User
von Gunnar F. (gufi36)


Lesenswert?

Zo R. schrieb:
> Ich hab zwar in CHatGPD

und wie hast du das geschrieben?

Zo R. schrieb:
> leider funktioniert das hinten und vorne überhaupt nicht.

gratuliere zu der exzellenten Fehlerbeschreibung!

Ich fürchte, das wird nichts mit C#.

von Zo R. (hsch1978)


Angehängte Dateien:

Lesenswert?

Warum das wird nix. Ich kann unseren Code hier nicht kopieren.

: Bearbeitet durch User
Beitrag #7665408 wurde vom Autor gelöscht.
von Zo R. (hsch1978)


Lesenswert?

Im obigen Post wird das generierte Beispiel von ChatGPD geziegt.
1
protected virtual void OnMessageSent(string message)
2
        {
3
            if (MessageSent != null)
4
            {
5
                if (InvokeRequired)
6
                {
7
                    Invoke(new MessageEventHandler(OnMessageSent), new object[] { this, message });
8
                }
9
                else
10
                {
11
                    MessageSent(this, message);
12
                }
13
            }
14
        }

Wenn ich diesen Code hier bei mir platzire erscheint zum Beispiel diese 
Meldung:

Schweregrad  Code  Beschreibung  Projekt  Datei  Zeile 
Unterdrückungszustand
Fehler  CS0123  Keine Überladung für "OnMessageSent" stimmt mit dem 
Delegaten "MessageEventHandler" überein.

: Bearbeitet durch User
von Gunnar F. (gufi36)


Lesenswert?

Du sollst ja auch eine eigene Event-Klasse erzeugen, geerbt von 
EventArgs und dort die Message als Eigenschaft hinzufügen.

von Hans (ths23)


Lesenswert?

Zo R. schrieb:
> Wenn ich diesen Code hier bei mir platzire erscheint zum Beispiel diese
> Meldung:
>
> Schweregrad  Code  Beschreibung  Projekt  Datei  Zeile
> Unterdrückungszustand
> Fehler  CS0123  Keine Überladung für "OnMessageSent" stimmt mit dem
> Delegaten "MessageEventHandler" überein.
Tja Programmieren ist schon ein bissel mehr als nur Copy & Paste. Das 
muß man einfach lernen, damit man das dann auch versteht. Am besten geht 
das mit einem passenden Fachbuch oder auch einem guten Onlinetutorial, 
für was man sich entscheidet ist Geschmackssache - ich persönlich 
investiere da gern in Papier.
Das muß halt entsprechend durcharbeiten und dann eigenständig mal ein 
kleines Beispiel programmieren und nicht einfach was kopieren was man 
eigentlich noch gar nicht verstanden hat. Ja das ist mühsam und der Weg 
ist steinig, aber am Ende hat man es verstanden und kann es problemlos 
in eigenen Projekten anwenden.

Die Fehlermeldung ist ziemlich eindeutig: Sender und Empfänger passen, 
einfach ausgedrückt, nicht zusammen. Warum, mußt Du schon selber heraus 
finden.

: Bearbeitet durch User
von Zo R. (hsch1978)


Lesenswert?

Ok eine MessageEventHandler Klasse habe ich erstellt. Jetzt habe ich in 
der anderen Datei Fehlermeldungen:
1
MessageSent += Data_MessageSent;
2
3
private void Data_MessageSent(object sender, string message)
4
        {
5
            // Prüfe, ob Invoke erforderlich ist
6
            if (InvokeRequired)
7
            {
8
                // Verwende Invoke, um die Methode im UI-Thread aufzurufen
9
                Invoke(new Action<object, string>(Form1_MessageSent), sender, message);
10
            }
11
            else
12
            {
13
                // Aktualisiere die UI-Komponente mit den empfangenen Daten
14
                //labelData.Text = message;
15
            }
16
        }

Fehlermeldung: Der Name MessageSent ist im aktuellen Kontext nicht 
vorhanden.

Warum kann ich nicht in der anderen Form  MessageSent verwenden?

: Bearbeitet durch User
von Zo R. (hsch1978)


Lesenswert?

Ich vermute es liegt daran, dass ich keine Subscribe Funktion habe. Das 
Beispiel von ChatGPT passt nicht so zu meiner Anwendung. Wie kann ich in 
der View Form auf MessageSent zugreifen?

Verdammt es muss doch möglich sein.

: Bearbeitet durch User
von Zo R. (hsch1978)


Lesenswert?

Hans schrieb:
> Die Fehlermeldung ist ziemlich eindeutig: Sender und Empfänger passen,
> einfach ausgedrückt, nicht zusammen. Warum, mußt Du schon selber heraus
> finden.

Ja vielen Dank. Immer Dinge vorenthalten. Vielen Dank.

von Gunnar F. (gufi36)


Lesenswert?

Zo R. schrieb:
> Ja vielen Dank. Immer Dinge vorenthalten. Vielen Dank.

Programmieren lernen ist auch (durchaus anspruchsvolle) Arbeit. Tipps 
und Hilfestellung zu deiner Eigenleistung kriegst du hier für lau, aber 
eine ganze Schulung eher nicht. Immerhin würde es immer helfen, den 
eigenen Kenntnisstand ehrlich zu nennen. Dann wissen wir besser wo wir 
ansetzen müssen.

von Gunnar F. (gufi36)


Lesenswert?

P.S. Unverschämt werden ist auch kontraproduktiv!

von Zo R. (hsch1978)


Lesenswert?

Ich hab das ganze mit "Action" gelöst. Danke für deinen Tip mit delgate 
und Eventhandler.

: Bearbeitet durch User
von Hans (ths23)


Lesenswert?

Zo R. schrieb:
> Hans schrieb:
>> Die Fehlermeldung ist ziemlich eindeutig: Sender und Empfänger passen,
>> einfach ausgedrückt, nicht zusammen. Warum, mußt Du schon selber heraus
>> finden.
>
> Ja vielen Dank. Immer Dinge vorenthalten. Vielen Dank.

Das hat nichts mit vorenthalten zu tun. Ich habe das letzte Mal 2019 an 
einem C# Projekt gearbeitet. Da muß man sich dann auch erst mal wieder 
einarbeiten wie das genau funktioniert und ehe ich da auf die Schnelle 
was Falsches sage halte ich mich diesbezüglich lieber zurück. Allerdings 
weis ich noch, das wir da sehr viel mit Databinding gelöst haben. 
Fairerweise muß ich dazu sagen das das Projekt mit WPF gemacht wurde und 
da ist Bindig einfach die bessere Alternative.
Die Fehlermeldung zu lesen, ist nun auch kein Teufelswerk.

Aber ich merke schon Du hast gar keinen Bock Dich mit der Thematik 
auseinander zusetzen, Du bemühst lieber KI an statt selbst zu denken.

von Zo R. (hsch1978)


Lesenswert?

Hans schrieb:
> Aber ich merke schon Du hast gar keinen Bock Dich mit der Thematik
> auseinander zusetzen, Du bemühst lieber KI an statt selbst zu denken.

Was heißt da ich würde mich nicht bemüht. Die KI habe ich als letztes 
benutzt und hat mir nicht sonderlich viel geholfen. Ich habe anstatt 
einen Kollegen von einer anderen Abteilung gefragt.

: Bearbeitet durch User
von Hans (ths23)


Lesenswert?

Zo R. schrieb:
> Die KI habe ich als letztes
> benutzt und hat mir nicht sonderlich viel geholfen.
Das war/ist bei solchen speziellen Sachen zu befürchten.

Diese Thematik muß man sich selbst erarbeiten sonst wird das nichts. 
Eine guteBasis dafür ist z.B. Microsoft Learn, da gibt es ein recht 
umfangreiches Kapitel zum Thema "Databinding mit Windows Forms" 
(https://learn.microsoft.com/de-de/dotnet/desktop/winforms/data/overview?view=netdesktop-8.0). 
Das muß man halt durcharbeiten und es ist natürlich nicht in 5 Minuten 
erledigt, da muß man schon etwas Zeit einplanen. Das Ganze mal mit einem 
kleinen Testprojekt ausprobiert, ist da durchaus hilfreich. Aber man muß 
es halt wollen, KI fragen ist sicher einfacher, aber es führt eben nicht 
immer Ziel wie man sieht. Die Zeit die Du hier mit KI und Copy & Paste 
verdattelt hast, wäre in das Durcharbeiten der Thematik deutlich besser 
investiert gewesen und hätte Dich am Ende deutlich weiter gebracht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.