Hallo zusammen
Ich habe eine Win Form mit einer Textbox, aber es wird kein Text angezeigt wenn ich textBoxErrors.Text = "StringText"; aufrufe
Der Code ist wie folgt aufgebaut:
Im Program:
public class Klasse
{ ...
public void methode()
{ ....
GUIForm guiForm = new GUIForm();
try{}
catch (Exception e)
{
// Let the user know what went wrong.
guiForm.ShowError("The file could not be read:" + e.Message);
}
}
}
In der Form:
public partial class GUIForm : Form
{
public void ShowError(string message)
{
textBoxErrors.Text = message;
}
}
Wenn ich beim Debuggen ein breakpoint bei textBoxErrors.Text = message; setze, sehe ich das .Text den String: "The file could not be read: ...." enthält.
Aber in der Form steht nichts, auch zur laufzeit nicht.
Was mach ich falsch?
Vielen Dank im Vorraus und Gruss
Was hast Du genau vor, was ist das Ziel?
Exception Handling in C# hat nen klaren Guide, der deutlich von Deinem Code abweicht 😃
Exceptions and Exception Handling (C# Programming Guide)
Ansonsten hast Du einen Design Fehler: Du greifst offenbar von der Logik auf die UI zu.
Das ist genau falsch rum.
[Artikel] Drei-Schichten-Architektur
Sowas kann auch Folgefehler verursachen; eventuell hast Du mehrere Instanzen durch das Fehldesign?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Was hast Du genau vor, was ist das Ziel?
Ziel wäre, dass wenn aus der Logik, etwas passiert, was nicht passieren sollte (z.B. exeption, oder default case, oder leere variablen usw.) Sollte dies in der Form als Text angezeigt werden. Den String selber verfasst, oder z.B. von der Exeption.message.
Diese wollte ich nun mit einer read only Textbox realisieren....
Ansonsten hast Du einen Design Fehler: Du greifst offenbar von der Logik auf die UI zu.
Das ist genau falsch rum.Sowas kann auch Folgefehler verursachen; eventuell hast Du mehrere Instanzen durch das Fehldesign?
Aber wie kann ich das umkehren? Die "Tigger" kommen ja aus der Logik.
Exception Handling in C# hat nen klaren Guide, der deutlich von Deinem Code abweicht 😃
In wie fern weicht, es ab? Ich habe das try{} einfach hier im Beitrag leer gelassen weil es nicht relevant ist. Oder was meinst Du?
Prinzipiell zwei Arten:
Mir ist aber unklar, was Du vor hast und was hier passt.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Ich will Strings aus der Logik in der Form anzeigen.
Strings= Fehlermeldetexte durch exeptions oder andere ungültige Vorgänge die in der Logik produziert werden.
Oder was ist noch unklar?
Jo, hab ich verstanden. Aber was Du im Sinne von OOP hier vor hast ist nicht klar.
Hast Du Methoden, die Du synchron ausführen willst? Hast Du Events, auf die Du reagierst?
Aber in beiden Fällen: schau Dir an wie OOP in C# funktioniert.
Und wie man eben mit Events asynchron - sofern das der Usecase hier ist - die UI informiert.
[FAQ] Eigenen Event definieren / Information zu Events (Ereignis/Ereignisse)
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Achso, ja danke. Ich schau mir das an!
Bitte keine Full Quotes. Hab jetz alle Deine Beiträge editiert...
[Hinweis] Wie poste ich richtig?
Ich hatte dir doch schon in Wie kann ich über einen Button eine Methode starten? passende Links gegeben.
Du hast einen typischen Anfängerfehler gemacht (nämlich ein neues Form-Objekt zu erzeugen), welches auch in meinem Artikel erklärt ist.
Ich hatte dir doch schon in
> passende Links gegeben.
Darin sind aber die Beispiele von Form zu Form, ich will ja von Logik zu Form. Oder welches der Kapitel darin wäre die Analogie?
Genau und da gibt es zwei Hauptmöglichkeiten:
Die Lösung zwei ist die Lösung die am wenigsten Probleme bereitet.
Gruß Thomas
Gleich der erste Satz meines Artikels lautet:
Dieser Beitrag beschreibt die Vorgehensweise beim Datenaustausch zwischen mehreren Formularen (Forms) und/oder Klassen.
Das Benutzen von Ereignissen (Events) ist eine generelle Programmiertechnik (gerade beim Datenaustausch zwischen verschiedenen Schichten, wie eben UI und Logik).
Und gerade das Benutzen eines UI-Objekts in der Logik ist ja eine Schichtverletzung.
- Die Instanz der Form holen und dann anzeigen lassen (hier gibt es aber mehrere Probleme: Stichwort Invoke)
Invoke ist kein Problem. Die Referenz der UI in der Logik ist das Problem.
Das ist eine Schichtverletzung.
- Die Logik schmeist ein Event, welches bei der Form angemeldet ist
Das ist der prinzipiell richtige Weg.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Invoke ist kein Problem. Die Referenz der UI in der Logik ist das Problem.
Stimmt natürlich, bei seinem aktuellen Problem.
Aber spätestens mit einem Task oder Thread o.ä. wird er dann auf das Problem stoßen.
Die Referenz von Logik auf UI ist auch mit Tasks ein Problem.
Vermute aber, dass Du prinzipiell den Thread-übergreifenden Zugriff meinst.
Und hier gilt eigentlich immer, egal ob mit Events oder Tasks den Invoke-Zugriff zu überprüfen.
[FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)
Invoke ist aber kein Problem: das ist ein Standard-Werkzeug in der UI-Welt.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code