Autor Beitrag
erfahrener Neuling
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 233
Erhaltene Danke: 19

Win 7, Win 10
C#, ASP-MVC (VS 2017 Community), MS SQL, Firebird SQL
BeitragVerfasst: Mi 02.03.16 11:50 
Hallo,

ich sitze grad an einem Programm, wo ich mehrmals Text einer RichTextBox hinzufüge (also nicht manuell eingebe).

Nun wollte ich es so machen, das bei bestimmten Exceptions die Fehlermeldung in roter Farbe hinzugefügt wird.
Am einfachsten hielt ich es, dies mit .ForeColor zu erledigen

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
catch (Exception E)
{
    richTextBoxOut.ForeColor = Color.Red;
    richTextBoxOut.Text += "ERROR: " + E.Message;
    richTextBoxOut.ForeColor = Color.Black;
}

Das hat aber nicht funktioniert. Auch in anderem Kontext hat sich mit ForeColor nichts geändert. Ich weiß, dass es auch mit markiertem Text der TextBox funktionieren soll, mir gefällt die Lösung mit ForeColor aber deutlich besser.

Hier also meine Frage: Wie setze ich .ForeColor richtig ein, um allgemein die Farbe des anzuzeigenden Textes einer Textbox zu ändern?

Mfg
Neuling


Zuletzt bearbeitet von erfahrener Neuling am Do 03.03.16 09:26, insgesamt 1-mal bearbeitet
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4795
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 02.03.16 13:23 
Hallo und :welcome:

du mußt den Bereich vorher selektieren, z.B. mittels
ausblenden C#-Quelltext
1:
2:
richTextBox.SelectionStart = 0;
richTextBox.SelectionLength = 42;

und danach dann dessen Attribute (z.B. die Farbe) ändern.

Für diesen Beitrag haben gedankt: erfahrener Neuling
erfahrener Neuling Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 233
Erhaltene Danke: 19

Win 7, Win 10
C#, ASP-MVC (VS 2017 Community), MS SQL, Firebird SQL
BeitragVerfasst: Mi 02.03.16 14:21 
Hi danke erstmal für deine schnelle Antwort.
Ja das mit Text-Selection hab ich auch schon gesehen.

Meine Frage richtete sich aber eher wirklich nach .ForeColor.

BSP: Ich will, dass meine TxtBox immer nur roten Text anzeigt, egal welcher. Dann müsste es doch mit ForeColor möglich sein (?), nur verändert es nichts.

Wozu kann ich's dann also gebrauchen/wie verwenden, wenn es scheinbar nichts verändert?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 02.03.16 14:25 
user profile iconerfahrener Neuling hat folgendes geschrieben Zum zitierten Posting springen:
BSP: Ich will, dass meine TxtBox immer nur roten Text anzeigt, egal welcher. Dann müsste es doch mit ForeColor möglich sein (?), nur verändert es nichts.
Du setzt doch ForeColor sofort wieder auf "Black", wie soll denn dann was in Rot angezeigt werden? :gruebel:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 02.03.16 14:42 
Du hast die ForeColor auf Black gesetzt also ist jeder Text der nicht per rtf markierung was anderes darstellen möchte schwarz.

Wenn du individuell formatierten Text willst mußt du eigentlich rtf sprechen und nicht einfach nur PlainText. Trotzdem in diesem speziellen Fall reicht es wenn du, wie TH69 schon geantwortet hat, den Text den du anpassen willst zu markieren(selektierung) und dann die Farbe der Selektion(SelectionColor) änderst.
erfahrener Neuling Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 233
Erhaltene Danke: 19

Win 7, Win 10
C#, ASP-MVC (VS 2017 Community), MS SQL, Firebird SQL
BeitragVerfasst: Mi 02.03.16 15:01 
Also ich hab es jetzt mal mit selection versucht. Ergebnis war, dass die Fehlermeldung zwar korrekt in rot angezeigt wurde, aber wenn ich danach eine weitere 'normale' Ausgabe in schwarzem Text provoziere, färbt sie sich automatisch wieder schwarz.

hier der code dazu:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
catch (Exception E)
    {
         richTextBoxOut.Select(richTextBoxOut.TextLength, E.Message.Length);
         richTextBoxOut.SelectionColor = Color.Red;
         richTextBoxOut.AppendText("ERROR: " + E.Message);
         richTextBoxOut.Select();
    }

Wie kann ich das jetzt verstehen? ich hab sonst im Text nirgendwo anders select oder foreColor verwendet.

PS: Zu foreColor: hab ich jetzt verstanden und hat sich auch erledigt damit.

Danke für die Antworten, haben mir geholfen (mein Problem ist nur noch nicht gelöst ;))
erfahrener Neuling Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 233
Erhaltene Danke: 19

Win 7, Win 10
C#, ASP-MVC (VS 2017 Community), MS SQL, Firebird SQL
BeitragVerfasst: Mi 02.03.16 15:36 
Also nochmal zur Beschreibung: Ich hab eine RichTextBox, die nur zum anzeigen dient, d.h. ich füge dieser per Button Text bei, gebe diesen aber nicht selber ein. Dieser Text soll ganz normal in schwarz angezeigt werden (passiert auch so).

Kommt es zu besagter Exception, soll diese ebenfalls der RichTextBox hinzugefügt werden, markiert und rot gefärbt werden(funktioniert so weit).
Danach soll wieder per Button-Druck Text in schwarz hinzugefügt werden, bei Exception wieder in rot, usw.

Bei mir ist es jetzt so, dass nach einer roten Exception bei neuem Text/oder neuer Exception die vorherige Exception wieder schwarz wird.

Also muss ich irgendwas beim 'selecten' falsch gemacht und/oder etwas nicht verstanden haben.

hier nochmal etwas mehr code:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
private void buttonStart_Click(object sender, EventArgs e)
{
    String Abfrage = ...
    String connectionString = "...";

    FbConnection connection = new FbConnection(connectionString);

    try
    {
        connection.Open();
        try
        {
            richTextBoxOut.Text += "\n\n>>>NEW QUERY<<< (" + Abfrage + ")\n\n";
            executeCommand(Abfrage, connection);
        }
        catch (Exception E)
        {
            richTextBoxOut.Select(richTextBoxOut.TextLength, E.Message.Length);
            richTextBoxOut.SelectionColor = Color.Red;
            richTextBoxOut.AppendText("ERROR: " + E.Message);
            richTextBoxOut.Select();
        }

        connection.Close();

    }
    ...
}

private void executeCommand(String query, FbConnection connection)
{
     FbCommand cmd = new FbCommand(query, connection);
          
     FbDataReader DataReader = cmd.ExecuteReader();
     while (DataReader.Read())
     {
          for (int i = 0; i < DataReader.FieldCount; i++)
          {
               richTextBoxOut.Text += DataReader[i];     //fügt Inhalt des Readers der Textbox hinzu
               richTextBoxOut.Text += "\t";              //fügt einen Zeilenumbruch hinzu
          }
          richTextBoxOut.Text += "\n";
     }
     DataReader.Close();
     richTextBoxOut.Text += "\nDatareader closed.";
}

FRAGE: Wie erreiche ich es, dass Fehlermeldungen konstant rot bleiben, egal was danach der TxtBox hinzugefügt wird?

Bitte nochmal dringend um Hilfe!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4795
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 02.03.16 17:35 
Hallo,

wie (bzw. wo) setzt du denn die Schriftfarbe wieder auf Schwarz?

Dein Selektierungscode kommt mir aber auch ein wenig komisch vor, da du jetzt ja erst selektierst und dann erst nachträglich den Fehlertext hinzufügst (mag aber sein, daß es trotzdem so korrekt funktioniert, weil erst in der Nachrichtenschleife der RichTextBox der Code dafür ausgeführt wird).
erfahrener Neuling Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 233
Erhaltene Danke: 19

Win 7, Win 10
C#, ASP-MVC (VS 2017 Community), MS SQL, Firebird SQL
BeitragVerfasst: Do 03.03.16 09:36 
Hi,

ich hab heut früh nochmal ein bisschen rumprobiert. Ergebnis war das gleiche wie gestern

@Th69
Zitat:
wie (bzw. wo) setzt du denn die Schriftfarbe wieder auf Schwarz?

Muss ich doch gar nicht, oder? Ich will ja nur den markierten Text färben, aber dauerhaft.

Also, wie kann ich den dauerhaft gefärbt lassen?
ODER

Falls das nicht geht, wie kann ich die Positionen der alten Nachricht bei der neuen Selektierung mit angeben?

ODER

Ist richTextBox gänzlich unfähig, Text(auch wenn er nicht markiert ist) gefärbt zu lassen?

Hoffentlich kann mich jemand aufklären

Gruß
der Neuling

EDIT:
Hab grad rausgefunden, dass das ganze ja auch mit AppendText funktioniert
ausblenden C#-Quelltext
1:
richTextBoxOut.AppendText(E.Message, Color.Red);					

allerdings dort das Gleiche, der Text BLEIBT einfache nicht rot.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 03.03.16 10:47 
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
        catch (Exception E)
        {
            richTextBoxOut.Select(richTextBoxOut.TextLength, E.Message.Length);
            richTextBoxOut.SelectionColor = Color.Red;
            richTextBoxOut.AppendText("ERROR: " + E.Message);
            richTextBoxOut.Select();
        }

Ich bin kein C#-Experte, aber das kann nicht funktionieren.
Dein Select fängt am Ende des Textes an und wählt ab da die Anzahl der Zeichen deines neuen Textes aus, der noch gar nicht vorhanden ist.
Folglich ist die Länge des gewählten Textes "0". Du hast nichts im Text ausgewählt. Dadurch kann auch nichts gefärbt werden.
Also erst die Textlänge merken.
Dann den Text hinzufügen.
Dann das Select mit der gemerkten Textlänge und der Länge des neuen Textes ausführen.
Danach die Farbe auf den selektierten Bereich anwenden.
Abschließend den selektierten Bereich wieder aufheben.

Sollte das immer noch nicht funktionieren, würde ich erstmal prüfen, ob der Text mit diesem Verfahren überhaupt selektiert wird und dann schrittweise den Source ergänzen.
erfahrener Neuling Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 233
Erhaltene Danke: 19

Win 7, Win 10
C#, ASP-MVC (VS 2017 Community), MS SQL, Firebird SQL
BeitragVerfasst: Do 03.03.16 11:53 
Ne also das mit dem markieren hat schon geklappt. Ich kann ja mal versuchen, die Logik meines handelns zu erläutern.

ausblenden C#-Quelltext
1:
2:
3:
4:
richTextBoxOut.Select(richTextBoxOut.TextLength, E.Message.Length); //hier lege ich die Position, wo die Markierung starten 
                                                                    //soll mit richTextBoxOut.TextLength
                                                                    //(also bisher geschriebener Text) fest
//das gleiche könnte man vorher auch mit einer int Variable machen

ausblenden C#-Quelltext
1:
2:
richTextBoxOut.AppendText("ERROR: " + E.Message); //dann füge ich den Text hinzu, der jetzt im markierten Bereich liegen sollte
richTextBoxOut.Select(); //select ist dann hier eigentlich unötig


UPDATE: jetzt funktioniert (ich habe nichts verändert!) es, dass hintereinanderkommende Fehlermeldungen rot angezeigt werden.
Normaler Text dagegen färbt alles wieder schwarz. :confused:

Ich habe mal 2 Bilder des Outputs als Anhang mal mit dazu gepackt.

FAZIT: Ist ja jetzt ganz egal, wie ich was geschrieben habe. Ich möchte, wie es in der eigentlichen Fragestellung steht, ein Bsp., wie man dauerhaft gefärbten Text in einer richTextBox erhält (muss doch möglich sein).

Danke schonmal im vorraus!
Einloggen, um Attachments anzusehen!