Laden...

Wie kann ich Text in einer TextBox anzeigen?

Erstellt von Automatinator vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.870 Views
A
Automatinator Themenstarter:in
18 Beiträge seit 2020
vor 4 Jahren
Wie kann ich Text in einer TextBox anzeigen?

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

16.834 Beiträge seit 2008
vor 4 Jahren

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?

A
Automatinator Themenstarter:in
18 Beiträge seit 2020
vor 4 Jahren

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?

16.834 Beiträge seit 2008
vor 4 Jahren

Prinzipiell zwei Arten:

  • Die UI ruft etwas aus der Logik auf: Exceptions für unbehandelte Ausnahmen
  • Die Logik will die UI über etwas "antriggern" / informieren: Events.

Mir ist aber unklar, was Du vor hast und was hier passt.

A
Automatinator Themenstarter:in
18 Beiträge seit 2020
vor 4 Jahren

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?

16.834 Beiträge seit 2008
vor 4 Jahren

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)

A
Automatinator Themenstarter:in
18 Beiträge seit 2020
vor 4 Jahren

Achso, ja danke. Ich schau mir das an!

Hinweis von Abt vor 4 Jahren

Bitte keine Full Quotes. Hab jetz alle Deine Beiträge editiert...
[Hinweis] Wie poste ich richtig?

4.939 Beiträge seit 2008
vor 4 Jahren

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.

A
Automatinator Themenstarter:in
18 Beiträge seit 2020
vor 4 Jahren

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?

1
124 Beiträge seit 2012
vor 4 Jahren

Genau und da gibt es zwei Hauptmöglichkeiten:

  1. Die Instanz der Form holen und dann anzeigen lassen (hier gibt es aber mehrere Probleme: Stichwort Invoke)
  2. Die Logik schmeist ein Event, welches bei der Form angemeldet ist

Die Lösung zwei ist die Lösung die am wenigsten Probleme bereitet.

Gruß Thomas

4.939 Beiträge seit 2008
vor 4 Jahren

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.

16.834 Beiträge seit 2008
vor 4 Jahren
  1. 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.

  1. Die Logik schmeist ein Event, welches bei der Form angemeldet ist

Das ist der prinzipiell richtige Weg.

1
124 Beiträge seit 2012
vor 4 Jahren

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.

16.834 Beiträge seit 2008
vor 4 Jahren

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.