Zwei versch. Richtextboxen - gleichen Text simultan markieren

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Zwei versch. Richtextboxen - gleichen Text simultan markieren

    Hallo liebe Community!

    Kurz ein paar Worte zu mir, damit ihr ein wenig meinen Background bzw. mich selbst einschätzen könnt.
    Zu mir: Bin 40 Jahre alt - habe mit 21 eine Ausbildung zum Fachinformatiker (AE) abgeschlossen und damals dann recht tiefgehend etwa 11 Jahre ASP, VB, C# und Java programmiert. Dann kam ein radikaler Jobwechsel bis Ende letzten Jahres. Also hatte ich nun etwa genau so lange nichts mehr mit dem Programmieren zutun, wie ich es einst getan habe, ca. 11 Jahre.
    Nun muss ich in meiner neuen Firma kleinere Tools schreiben, hoffentlich bleibt es erst einmal bei VB.NET. Es ist echt verrückt wieviel man wieder vergisst.

    Zu meinem Problem:
    Stellt euch vor es liegen zwei RTB vor. Sagen wir txtBoxLeft und txtBoxMain. Dazu einen (!) Button über den dann automatisch zwei UTF-8-Dateien in die jeweilige RTB geladen werden. Alles schon funktionsfähig.
    Nun gibt es einen festgelegten SuchString, sagen wir mal "<!-- Test". Diesen lasse ich in einer Combobox ausgeben. Wenn ich also in der Combo ein Item auswähle, wird mir in einer RTB der Suchstring, welcher in der Combo gelistet und angeklickt wird, merkiert.
    Nun mein großes Problem und ich habe wirklich keine Ahnung wie das zu lösen ist - und ich bitte um Nachsicht dass ich "krasse Sourcecodes" noch nicht wieder richtig verstehe...
    Wie kann man - durch Auswahl eines Items aus einer Combobox - dieses Suchwort in zwei verschiedenen RTB anzeigen/markieren lassen (das Markieren habe ich bereits etc.), aber es gelingt mir nicht dass zwei RTB dies "kapieren". Ich denke es liegt am Fokus. Aber ich habe eben keine Ahnung wie das gehen kann.
    Vielen Dank fürs Lesen (das nächste Mal wird der Text um 80% reduziert ;) ), vielleicht kann mir ja jemand aus der Patsche helfen. ?( :thumbup:

    Aus Tipps und Tricks verschoben ~ EaranMaleasi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „EaranMaleasi“ ()

    Moin und herzlich willkommen

    Wenn ich das richtig verstehe hast du 1 x ComboBox und 2 x RichTextBox.
    Und bei Änderung bzw. Auswahl in deiner ComboBox soll ein Wert in die RichtTextBox geschrieben werden.
    Korrekt?

    Falls ja dann musst du an das Änderungsevent deiner ComboBox herantreten: DeineComboBox.SelectedIndexChanged
    Hier kannst du nun die Werte, wo auch immer sie herkommen, an deine DeineRichTextBox.Textübergeben

    Solltest du es anders meinen musst du es nochmal erklären. :|
    @FeelingCodeAgain Willkommen im Forum. :thumbup:
    Du musst den Text in der RTB finden und markieren, das ist im Prinzip ganz einfach.
    Ich nehme mal an, dass mehrere gefundene Texte pro RTB alle markiert werden sollen.
    Nehmen wir mal die einfachere Variante ohne RegEx.
    String hat die Methode .IndexOf(...): docs.microsoft.com/de-de/dotne…ystem_Int32_System_Int32_
    Starte mit Index 0 und bei jedem weiteren mit LastIndex + 1.
    Das Markieren in einer RTB geht so:

    VB.NET-Quellcode

    1. .SelectionStart = DEIN_EBEN_GEFUNDENER_INDEX
    2. .SelectionLength = DIE_LÄNGE_DES_SUCHSTRINGS
    3. .SelectionColor = DEINE_MARKIERUNGSFARBE
    Feddich.
    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!
    Willkommen im Forum.
    Ich interpretier das Problem anders.
    Mach mal bei beiden RTBs HideSelection auf False, damit die Stellen in beiden sichtbar markiert werden, auch wenn die RTBs nicht den Fokus haben.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Hi willkommen im Forum

    Hi @FeelingCodeAgain,
    hier mein Vorschlag ohne Anspruch auf Qualität. Sieh Dir eben das .gif im Anhang an (click drauf), ob der Code auch das macht was er soll :).

    1x Form
    Name -> Form1

    2x RichtTextboxen;
    Namen -> RtxbxRechts und RtxbxLinks

    1x Combobox
    Name -> CombxSearchString

    Winforms C# Kompletteslisting:
    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Drawing;
    4. using System.Text.RegularExpressions;
    5. using System.Windows.Forms;
    6. namespace WF_RtxbxTextHighLight
    7. {
    8. public partial class Form1 : Form
    9. {
    10. public Form1()
    11. {
    12. InitializeComponent();
    13. //--------------------------------------------------------------Uninteressant TestSetup
    14. RtxbxLinks.Text = "If the same seed is used for separate Random objects, " +
    15. "they will generate the same series of TestWort random numbers. This can be useful for " +
    16. "creating a test suite that processes random values, or for replaying games " +
    17. "that derive their data from ranTestWortdom numbers. However, note that Random objects " +
    18. "in processes TestWort running under different versions of the .NET Framework may return " +
    19. "different series of random numbers even if they're instantiated with identical seed values.";
    20. RtxbxRechts.Text = "To produce different sequences of random numbers, you " +
    21. "can make the seed value time-dependent, thereby producing a different series " +
    22. "with each new instance of Random. The parameterized Random(Int32) constructor can take " +
    23. "an Int32 value based on the number of ticks in the current time, whereas the parameterless Random() " +
    24. "constructor uses the system clock to generate its seed value. However, on the .NET Framework only, because " +
    25. "the clock has finite resolution, using the TestWort parameterless constructor to create different Random objects in " +
    26. "close succession creates random number generators that produce identical sequences of random numbers. " +
    27. "The following example illustrates how two Random objects TestWort that are instantiated in close succession in" +
    28. " a .NET Framework application generate an identical series of random numbers. On most Windows systems," +
    29. " Random objects created within 15 milliseconds of one another are likTestWortely to have identical seed values.";
    30. CombxSearchString.Items.Add("TestWort");
    31. CombxSearchString.Items.Add("if");
    32. CombxSearchString.Items.Add("random");
    33. //-------------------------------------------------------------^^^Uninteressant TestSetup
    34. }
    35. //Combox Auswahl ändert sich ... dann dass
    36. private void CombxSearchString_SelectedIndexChanged(object sender, EventArgs e)
    37. {
    38. //Ruf Funktion 'Highlight' auf mit dem Suchtwort und der Textbox/Text die durchsucht werden soll
    39. //Parameter im Funktionsaufruf sind CombxSearchString.Text -> das gewählte Suchwort aus der Cmbx
    40. //und der Name der Richtextbox
    41. Highlight(CombxSearchString.Text, RtxbxRechts); //---> Highlight Suchwort in der einen RichTextbox
    42. Highlight(CombxSearchString.Text, RtxbxLinks); //---> Highlight Suchwort in der anderen RichTextbox
    43. }
    44. public void Highlight(string searchString, RichTextBox rtxbx)
    45. {
    46. //lösche alle Highlights von vorhergehenden Suchen
    47. rtxbx.SelectionStart = 0;
    48. rtxbx.SelectAll();
    49. rtxbx.SelectionBackColor = Color.White;
    50. //Such per Regex das Suchwort im Text
    51. var matches = Regex.Matches(rtxbx.Text, searchString);
    52. List<int> matchIndexes = new List<int>();
    53. //muesste ich auch wieder nachsehen Stichwort Regex MatchCollection (CopyPaste von einem meiner Projekte)
    54. //Sammele alle AnfangsIndixes vom Suchwort in einer List<int>
    55. foreach (Match match in matches)
    56. {
    57. foreach (Group item in match.Groups)
    58. {
    59. matchIndexes.Add(item.Index);
    60. }
    61. }
    62. //setzt Hintergrundcolor von <StartIndex..bis..length>
    63. int matchLength = searchString.Length;
    64. Color colorHighlight = Color.Yellow;
    65. foreach (var i in matchIndexes)
    66. {
    67. rtxbx.SelectionStart = i;
    68. rtxbx.SelectionLength = matchLength;
    69. rtxbx.SelectionBackColor = colorHighlight;
    70. }
    71. }
    72. }
    73. }


    Frag ruhig wenn Du was wissen möchtest :)

    Links
    RegexMatchCollection
    Bilder
    • VBPara.gif

      525,81 kB, 704×510, 97 mal angesehen
    codewars.com Rank: 4 kyu

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „nogood“ ()

    @All: Bevor wir hier weiter Spekulatius backen, sollte @FeelingCodeAgain mal was zu unseren Vorschlägen sagen.
    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!
    Oh verdammt! Jetzt war ich mal seit meinem (Erst-)Beitrag nicht mehr hier und sehe (durch Zufall) dass ich schon zahlreiche Hilfen erhalten habe - herzlichen Dank dafür schon einmal und Entschuldigung zugleich, dass ich das jetzt erst sehe / schreibe!!!!!!!
    Wahnsinn, vielen lieben Dank, ich muss mir jetzt erst reinmal die ganzen Antworten ansehen!!! :)

    // Edit: Ich blicke das mit dem Forum noch nicht ganz - sorry ;-(. Ich wollte eben antworten, kann es aber nicht - ist das irgendwie nicht freigeschalten?
    Ich wollte mitteilen dass oben tatsächlich DER Tipp ist, der zum Erfolg geführt hat - nämlich der von @VaporiZed, die Hideselection auf False zu setzen!! Bravo & herzlichen Dank!!!!!!

    FeelingCodeAgain schrieb:

    Ich wollte eben antworten, kann es aber nicht - ist das irgendwie nicht freigeschalten?
    Wenn der letzte Post von Dir selbst ist, kannst Du 30 Minuten nicht antworten, sondern nur jenen letzten Beitrag bearbeiten. Diese Funktion soll vor SPAM schützen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.