Laden...

Aus Klasse in Textbox schreiben

Letzter Beitrag vor einem Monat 5 Posts 233 Views
Aus Klasse in Textbox schreiben

Moin moin zusammen,

ich versuche aus einer Klasse eine Textbox mit Daten zu füllen. So als Log anzeige. Allerdings werden nach dem Umstellen der Log funktion in eine Separate Klasse keine Daten mehr in der Textbox angezeigt.

Kurz vorweg, wofür das Programm ist:

Ich habe eine Programm, das auf HttpGet regiert und JSon Dateien in eine Datenbank schreiben soll. Jetzt ist der Quellcode zu Lang geworden und ich habe vieles ausgelagert in separate Klassen. Unteranderem auch das erstellen der Log Informationen. Diese funktion wird überall im Quellcode aufgerufen. Verarbeitet die Infos, schreibt alles in eine Datei und am Ende sollen diese Infos auch in eine große Multiline Textbox geschreiben werden.

Ich verwende den MaterialSkin 2.2.3.1. Daher eine Multiline Textbox und keine Richt Text Box (Wollte erst die RTF verwenden wegen der Schriftfarbe, dann funktioniert allerdings das Design nicht mehr. Umschalten von dem Dark Light Theme)

Der Code:

Der aufruf der Log funktion:

CsLogs.ErrorLog(1, "Fehler Text", ex);

Die Log funktion:

    public static void ErrorLog(int Log, string Message, System.Exception ex)
    {
        string text = null;
        string exreg = null;

        if (ex != null)
        {
            Regex reg = new Regex("\n");
            exreg = reg.Replace(ex.ToString(), "\n\t");
        }

        if (Log == 1)
        {
            // Error Generator
            text = DateTime.Now.ToString("HH:mm:ss") + " | Error   | " + Message + "\n";
            text += "\t" + exreg;
        }
        if(Log == 2)
        {
            // Warnung Generator
            text = DateTime.Now.ToString("HH:mm:ss") + " | Warning | " + Message + "\n";
            text += "\t" + exreg;
        }
        string filePath = @"..\Logs\ErrorLog.txt";

        // Schreiben der Logs in eine Text Datei, entfernt damit der Code klein und übersichtlich bleibt. Hier kommt alles an wie es soll
        
        Main main = new Main();
            if (Global.LogLevel >= Log)
            {
                main.Webhook = text;
                //main.TextboxAdd(text);
            } 
    }

In der Main die Publik deklaration der Webhook Variable:

 public string Webhook
{
    get { return _Webhook; }
    set
    {
        _Webhook = value;
        
        MessageBox.Show(Webhook);  // Zum Prüfen ob überhaupt Daten ankommen. Und es funktioneirt
        mtbWebhook.Text += Webhook; // Beim Debug stehen hier auf beiden Seiten die geünschten Daten. Es wird aber nichts angezeigt.
        // in der MaterialSkin Dll sind 2 Multiline Textboxen. Bei der 2ten TextBox wurde nur der Name geändert.
        mtbWebhook2.Text += Webhook; // Beim Debug stehen hier auf beiden Seiten die geünschten Daten. Es wird aber nichts angezeigt.
    }
}

Was ich auch schon versucht habe über eine funktion das zu regeln.

public void TextboxAdd(String Value) 
        {
            mtbWebhook.Invoke((MethodInvoker)delegate () {
                mtbWebhook.Text = Value;
            });
        }

Auch ohne dem verweis auf die Main in der CsLog Klasse kommen die Daten in die Variable. Aber es erscheint nichts in der Text Box.

Stand aktuell:

Die Daten sind in der Main (Hieß vorher Form1) in der Variable mtbWebhook. Es wird auch kein Fehler beim Kompilieren angezeigt. Warnungen habe ich nur zu Variablen, die deklariert sind, aber nicht benutzt werden. Aber in der Textbox erscheint kein Text. Obwohl in der mtbWebhook.Text der richtige text steht.

Hallo,

mittels Main main = new Main()erstellt du eine neue (aber unsichtbare) Form-Klasse und beschreibst dessen TextBox. Du benötigst entweder eine Referenz auf die existierende Form oder aber noch besser, du verwendest ein Ereignis dafür: [FAQ] Eigenen Event definieren / Information zu Events (Ereignis/Ereignisse)

Ich habe hierfür auch extra einen Artikel geschrieben: Kommunikation von 2 Forms (gilt auch für Form-Klasse-Kommunikation)

Hi, das mit dem Main hab ich mir schon gedacht. Ohne diesem Aufruf bekomme ich den Fehler:

CS0120 (Für das nicht statische Feld, die Methode oder die Eigenschaft "Main.TextboxAdd(string)" ist ein Objektverweis erforderlich.)

Ich hab mir daher mal das mit den Ereignissen angesehen. Allerdings ist das Glaube ich für mich nicht so ganz Passend. Da die Funktion aus der Main und auch aus den anderen Klassen wie z.b. HttPServer.startListeningForConnection() aufgerufen wird. Und alle sollen in die main.mtbWebhook.Text schreiben.

Im Anhang hab ich nen Bild angefügt, vielleicht Zeigt das etwas besser, wie der Daten Verlauf ist. Daas Speichern in die Datei funktioniert super. Nur eben nicht die TextBox.

Da ich das mit dem Event nicht so ganz verstanden hatte, hab ich mir da auch den Code von Herbivore (https://mycsharp.de/forum/threads/8799/loesung-problem-mit-eventhandler-fertige-code-snippets-inkl-erklaerung) und Coding mit Jannik (https://www.youtube.com/watch?v=ucpoIoOoe_0) angesehen. Jetzt glaube ich hab ich es so langsam verstanden.

Ein Hinweis: in fast jeder Runtime-Technologie gibt es einen Standard, die man loggt. In .NET ist das das ILogger-Interface.
Docs: Logging in C# and .NET

Hier selbst was zu erfinden, ist fast immer der schlechteste Weg.

Das ILogger Interface ist unabhängig und standardisiert, sodass verschiedene "Log Consumer" angehängt werden können.
Der Stelle, an der Du loggst soll egal sein, wohin das Log später geschrieben wird. Du kannst dann zB das sehr verbreitete Serilog als Log-Provider verwenden, das dann in verschiedene Sinks schreiben kann.

Willst Du das Log selbst konsumieren in Deiner App, dann würdest Du eine ILoggerFactory erstellen, und dann in Deiner GUI darauf hören.

Werde ich mir mal ansehen. Klingt interessant.

Eigentlich wollte ich nur den Get String in der TextBox anzeigen lassen. Später kam dann die Idee auch die Warnungen und Fehler dort anzuzeigen. Ohne das jedes mal eine MessageBox erscheint. Weil eigentlich das Programm nur im Systemtray ist und im Hintergrund Daten in eine Datenbank schreibt. Das Eigentliche Programm ist dann separat.

-

Ich habe gestern abend auch noch mal einen Versuch unternommen, Nur den Error Log, der ja schon einmal so funktioniert hat, wie ich es wollte, wieder in die Main zu integrieren. Dan fliegt mir die Problematik mit den Static anweisungen um die Ohren.

Ich bin gerade am Überlegen, alles wieder in die Main zu packen. wären dann am ende knapp 1600 Zeilen. Oder sogar um zu steigen auf php. XD
Würde allerdings gerne bei C# bleiben