RichTextBox global editieren

  • C#
  • .NET (FX) 1.0–2.0

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Fakiz.

    RichTextBox global editieren

    Hallo,

    Die Frage mag vllt banal klingen aber da ich selten mit GUI-Apps und meistens mit Consolen-Anwendungen zu tun habe bin ich mir hier etwas unsicher:
    Auf meiner MainForm ist eine RichTextBox die als eine Art "Log" dient und global von überall in meinem Programm/Projekt her ansprechbar sein.
    Damit meine ich: Ich möchte von jeder Klasse aus in der Lage sein Text in der RichTextBox hinzuzufügen, sie zu clearen, evtl bestimmte Text farblich markieren und so weiter..
    Was ist die beste (Objekt Orientierteste) möglichkeit das zu machen? Per Property in der Klasse der Form oder wie sollte man das am elegantesten Lösen?

    Mfg
    Rikudo
    C# Developer
    Learning C++
    @Rikudo Property geht nicht, da dies von Main nach Sub-Class geht.
    Du kannst jeder Sub-Class ein Event geben, dass dan durchgereicht wird bis in die Main-Class, wo Zugriff auf die RTB besteht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich würde hierfür eine eigene Log Klasse verwenden. In die packst du Methoden wie AddLog, ClearLog usw. rein und stattes diese mit den dazugehörigen Events aus. Die Events abonierst du in der MainForm und an deine anderen Klassen gibst du die Instanz der Log Klasse weiter.

    Fakiz schrieb:

    Ich würde hierfür eine eigene Log Klasse verwenden. In die packst du Methoden wie AddLog, ClearLog usw. rein und stattes diese mit den dazugehörigen Events aus. Die Events abonierst du in der MainForm und an deine anderen Klassen gibst du die Instanz der Log Klasse weiter.

    Das klingt vernünftig, kannst du mir mal an einem Beispiel aufführen wie du das machen würdest?
    C# Developer
    Learning C++
    Naja genau so wie ers schreibt. Du machst eine static class Logger mit den Methoden AddLog, ClearLog etc. Außerdem enthält die Klasse die Events LogAdded und LogCleared. Intern haste dann iwie ne List<string> oder extra ne List<Log>, wobei Log dann ne Klasse ist die LogType und Message oder so kapselt. Wichtig ist, dass in der AddLog-Methode das LogAdded Event gefeuert wird, analog mit ClearLog.
    In der MainForm abbonierst du jz diese Events der Logger-Klasse, und in den Handler-Methoden schreibst du dann in die RTB. Es bietet sich an, das LogAdded in den EventArgs schon den neuen Log übergibt.
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    Plexian schrieb:

    Naja genau so wie ers schreibt. Du machst eine static class Logger mit den Methoden...
    ähm - das mit der static class schrieb er (Fakiz) nicht, sondern das ist von meim Mist.
    Und das static - egal wie mans nu umsetzt (Singleton-Pattern täte sich auch anbieten) ist das entscheidende.
    Und dann bitte nichts weiter zwischen iwelchen Instanzen übergeben oder durchreichen oder sowas.

    btw - wolle gugge die einfachst-mögliche Umsetzung des Singleton-Patterns? Singleton, Serialisierung (Json, Xml) und Databinding ohne Dataset
    ist zwar vb - kann man ja übersetzen.

    Weil im INet kursieren da hauptsächlich allerlei c#-mäßige Verumständlichungen zu.

    Das klingt vernünftig, kannst du mir mal an einem Beispiel aufführen wie du das machen würdest?


    Spoiler anzeigen

    Die Klasse repräsentiert den Log

    C#-Quellcode

    1. public class LogReport
    2. {
    3. /// <summary>
    4. /// Die Klasse die den Log hinzugefügt hat
    5. /// </summary>
    6. public string Sender { get; private set; }
    7. /// <summary>
    8. /// Zeit zu der der Log hinzugefügt wurde
    9. /// </summary>
    10. public DateTime Time { get; private set; }
    11. /// <summary>
    12. /// Log -Bericht
    13. /// </summary>
    14. public string Message { get; private set; }
    15. public LogReport(string sender, DateTime time, string message)
    16. {
    17. Sender = sender;
    18. Time = time;
    19. Message = message;
    20. }
    21. }


    EventArgs

    C#-Quellcode

    1. public class MyLogEventArgs
    2. {
    3. public class NewLog : EventArgs
    4. {
    5. public LogReport Log { get; private set; }
    6. public NewLog(LogReport log)
    7. {
    8. Log = log;
    9. }
    10. }
    11. }


    Die Log -Klasse

    C#-Quellcode

    1. public static class MyLogger
    2. {
    3. public static EventHandler<MyLogEventArgs.NewLog> OnNewLog;
    4. static void NewLog(LogReport log)
    5. {
    6. if (OnNewLog != null)
    7. OnNewLog(null, new MyLogEventArgs.NewLog(log));
    8. }
    9. /// <summary>
    10. /// Protokolierte Logs
    11. /// </summary>
    12. public static List<LogReport> Logs { get; private set; }
    13. // Konstruktor
    14. static MyLogger()
    15. {
    16. Logs = new List<LogReport>();
    17. }
    18. public static void AddLog(string sender, string message)
    19. {
    20. LogReport log = new LogReport(sender, DateTime.Now, message);
    21. Logs.Add(log);
    22. NewLog(log);
    23. }
    24. }


    *Edit*
    Der Aufruf

    C#-Quellcode

    1. private void Form1_Load(object sender, EventArgs e)
    2. {
    3. MyLogger.OnNewLog += NewLog;
    4. MyLogger.AddLog("Form1_Load", "HalloWelt");
    5. }
    6. private void NewLog(object sender, MyLogEventArgs.NewLog e)
    7. {
    8. MessageBox.Show(string.Format("Sender: \t{0}\nMessage: \t{1}\nTime: \t{2}", e.Log.Sender, e.Log.Message, e.Log.Time.ToShortTimeString()));
    9. }