Inhalt einer Combobox "umstylen"

  • VB.NET
  • .NET (FX) 3.0–3.5

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

    Inhalt einer Combobox "umstylen"

    Hallo mal wieder,

    dank eurer Hilfe wächst das Projekt. Nun habe ich folgendes Problem:
    In einer Sub wird eine HTML-Datei geöffnet; Der Inhalt wird in eine RTB geschrieben.
    Konkret ist die HTML-Seite jene, in der sämtliche Verlinkungen stehen. Für jeden Punkt in dieser Navigations-Bar steht im Quellcode z.B.
    <!-- Allgemeines --> oder <!-- Informationen / AGB -->, sehr viele von diesesn "unsichtbaren" Hilfen. Diese stehen in einer Combo.
    Also wie beschrieben steht in der Combo <!-- Allgemeines -->, darunter <!-- Informationen / AGB -->, .....
    Jetzt würde ich gerne in der Combo die Items ohne die HTML-Tags darstellen, also <!-- vorne und hinten das --> abschneiden.
    Das habe ich auch geschafft - bzw. den String so zu "beschneiden" dass nur noch der Text dazwischen in einer Variable steht. Da das Projekt klein angefangen hat und ich eben nicht mehr das Wissen habe, habe ich mir in einem solchen Forum eine Schleife kopiert, mit der ich die Combo fülle. Also eine Schleife, die nach String "<!--" die RTB durchläuft und die Matches in die Combo reinschreiben. Meine Schlefe ist aber glaube ich nicht sonderlich "schlau" gemacht, aber immerhin verstehe ich sie. Aber ich verstehe nicht, wie ich diese nun "umbauen" kann (was zwingend nötig ist), damit ich die "neue" Variable setzen kann - denn die Suche läuft über die Zeilennummer und ich weiß nicht, was ich ändern kann (bzw. eher WIE ich es ändern muss. Mein Code (gekürzt) wie folgt:

    VB.NET-Quellcode

    1. Dim position As Integer
    2. Dim zeilenummer As Integer
    3. Dim s, r, l As String
    4. comboSelectSectionLeft.Items.Clear()
    5. zeilenummer = 0
    6. 'Multiline-TextBox zeilenweise durchlaufen
    7. For Each line As String In txtBoxLeft.Lines
    8. zeilenummer += 1
    9. s = "<!--"
    10. position = line.IndexOf(s, 0)
    11. If position > -1 Then
    12. l = s.Substring(0, 4)
    13. r = s.Substring(s.Length - 4)
    14. s = s.Replace(l, "")
    15. s = s.Replace(r, "")
    16. 's beinhaltet nun das Wort ohne <!-- und -->
    17. comboSelectSectionLeft.Items.Add(txtBoxLeft.Lines(zeilenummer - 1)) 'hier die Suche - und ich weiß nicht wo ich "s" unterbringe, dass er mir das in die Combo 'schreibt.
    18. End If
    19. Next


    Ich hoffe, ich habe mich nicht zu komplitziert ausgedrückt ?( .
    Wäre toll wenn mir hier jemand helfen könnte. Und nicht zu komplitziert bitte, ich lerne mich gerade wieder ein und verstehe teilweise was ich hier so an Syntax lese nur Bahnhof :thumbsup:
    Also nur so, wie ich es mache :
    In Zeile 2 schreibe einfach mal noch = nothing und streiche dafür Zeile 5. Denn dann ist deine Variable Zeilenummer leer.
    Und du trennt ja den HTML Tag auf um herauszufinden welcher es ist, wenn ich das richtig verstanden habe.
    Gehe lieber vor, dass du dir direkt den Inhalt abgreifst, dann hast du direkt deinen HTML Tag.
    Sprich, du läufst ja eh die Zeilen durch und dort wo dein Tag Beginn ist suchst du direkt nach dem Ende (sind ja immer 3 Zeichen).
    Aber wo willst du es hinschreiben? Willst du durch die Auswahl in der ComboBox dann den Inhalt in der RichTextBox ausgeben? Verstehe die Frage nicht ganz.
    Wenn ja wäre ja eine Variable des Typs Dictionary (of String, String) das passende dafür.

    Wenn ich das gerade richtig sehe hast du diese Variable schon - deine comboSelectSectionLeft oder was ist das?
    Im Prinzip sucht du den HTML Tag und schreibst ihn als KEY und den entsprechenden Text als VALUE in dein Dictionary (of String, String).

    VB.NET-Quellcode

    1. ​DeineDictionaryVariable.Add(s, txtBoxLeft.Lines(zeilenummer -1))

    Sprich: DeineDictionaryVairable.Hinzufügen(DeinHTMLTag, DeinInhaltDesHTMLTag)

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

    Danke für deine Antwort. Fangen wir mal hinten an. Mit: Dictionary (of String, String) kann ich leider noch gar nichts anfangen (sorry).
    Die Suchmatches Suchstring / Variable vom Typ String ist s = "<!--".
    Das dient Leuten, die dieses Programm (es handelt sich um ein ziemlich spezielles CMS) als "Suchhilfe" an die richtige Stelle im Text springen können. Also in der Combo stehen die ganzen Infos (die nicht den Überschriften gleichen, das sind eher Hinweise). Der Benutzer klickt in der Combo ein Item an; der Cursor springt dann an dieses ausgewählte Item in der RTB, in der die ganze Datei steht und die Stelle wird (farblich) markiert. Daher ist es für den Benutzer "schöner" Eine Liste nur mit Wörtern zu haben als alle Wörter nebst HTML-Code.
    Also. in der rtb befindet sich eine html-Seite. Darüber eine Combobox mit "Sprunghilfen", die aus der RTB/HTML-Seite versteckt sind, daher ja <!-- blabla -->. Und in der Combo soll eben nur noch "blabla" stehen. Der Rest funktioniert ja, also per Klick springt in der RTB der Curser an dieses Wort, welches zeitgleich mit blauem Hintergrund kenntlich gemacht wird. Besser kann ich es nicht erklären. Vielleicht kannst du mir ja trotzdem helfen, sodass ich das verstehe - oder mir ein Schnippsel schreibst - worüber ich mich natürlich sehr freuen würde!

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

    Ok, jetzt versteh ich was du machen willst.

    Wenn dein Text aus der HTML Datei zum Beispiel wie folgt eingelesen wird:

    Quellcode

    1. <!-- Allgemeines -->
    2. Text Text Text
    3. <!-- Informationen / AGB -->
    4. Text Text Text

    dann weißt du die entsprechenden Zeilennummern ja sogar schon.
    Denn an dem Punkt For Each line As String In txtBoxLeft.Lines hast du ja alle Zeilen eingelesen, sprich die HTML Tags und den entsprechenden Text dazu.
    Damit hast du auch die Zeilennummern, wo was für ein Tag und entsprechender Text steht.
    Nun musst du nur in deiner FOR EACH Schleife dir zu deinem ComboBox Inhalt (dem HTML Tag) die Zeilennummer speichern.
    Damit komm ich wieder zum Dictionary (of TKEY, TVALUE) - für dich in diesem Fall ein Dictionary z.B.

    VB.NET-Quellcode

    1. DIM TagZeile AS Dictionary (of String, Integer)

    Und in deiner FOR EACH Schleife, an dem Punkt an dem du die ComboBox befüllst, befüllst du halt das Dictionary (TagZeile) und nimmst den KEY als ComboBox Inhalt und bei Änderung der ComboBox oder halt beim Klick auf einen Button SUCHE oder so ähnlich springst du in der RichTextBox an die entsprechende Stelle (hier der VALUE Wert zum KEY in der ComboBox)
    RichTextBox.SelectionStart oder RichTextBox.SelectedText, damit kommst du ja zum gesuchten Text oder du schaust mal hier bzgl. der RichTextBox.Find Methode
    Für soetwas würden sich Regex anbieten.
    Beispiel

    VB.NET-Quellcode

    1. import System.Text.RegularExpressions
    2. Private Shared Sub Main(ByVal args As String())
    3. Dim testString As String = "<!-- First comment -->" & vbLf & "Hallo" & vbLf & "<!-- Second comment-->World<!--My last comment-->"
    4. ' "\s" Stellt ein Leerzeichen dar das ? dahinter gibt an das dieses Leerzeichen optioanl ist, d.h. nach dem öffnenden bzw. vor dem schließendem Kommentartag kann ein Leerzeichen kommen muss es aber nicht.
    5. ' "([a-zA-z/\s]+)" Die beiden klammern schließen eine Gruppe (Groups(1)) ein. In dieser Gruppe sind alle Zeichen die sich in den [] befinden erlaubt.
    6. ' Also alle Buchstaben groß & klein sowie ein / und ein Leerzeichen \s
    7. Dim regex As Regex = New Regex("<!--\s?([a-zA-Z/\s]+)\s?-->")
    8. Dim mc As MatchCollection = regex.Matches(testString)
    9. For Each m As Match In mc
    10. Console.WriteLine("Von: {0} bis {1}, Kommentar: {2}", m.Groups(1).Index, (m.Groups(1).Index + m.Groups(1).Length), m.Groups(1).Value)
    11. Next
    12. Console.ReadLine()
    13. End Sub



    @ThomasG82
    In Zeile 2 schreibe einfach mal noch = nothing

    Versuch das doch mal und guck was passiert ;)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Fakiz“ () aus folgendem Grund: Rechschreibfehler

    In Zeile 2 schreibe einfach mal noch = nothing

    @Fakiz da hast du Recht, da war ich beim falschen Variablen Typ, mein Fehler

    Das mit dem Regex muss ich mir auch Mal anschauen,hab ich schon öfters gelesen aber selber noch nie genutzt