Autovervollständigung RichTextBox

  • VB.NET
  • .NET (FX) 4.0

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Orion.

    Autovervollständigung RichTextBox

    Tag zusammen
    Kann mir jemand sagen was ich an meinem Code noch ändern muss damit nicht bei jedem Tastenschlag alles untereinander neu gelistet wird?

    Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Linq
    3. Imports System.Environment
    4. Public Class FormAutoComplete
    5. Public _isbestkeyword As String = ""
    6. Public _iskeyword As Boolean
    7. Public woerterbuchS As New List(Of String)
    8. Public appData As String = GetFolderPath(SpecialFolder.ApplicationData)
    9. Public path As String = appData & "\Dokumente"
    10. Public Sub myForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
    11. Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
    12. Me.ListBox1.Dock = DockStyle.Fill
    13. End Sub
    14. Private Sub ListBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
    15. _isbestkeyword = Me.ListBox1.Items(Me.ListBox1.SelectedIndex)
    16. End Sub
    17. Protected Overrides ReadOnly Property ShowWithoutActivation() As Boolean
    18. Get
    19. Return True
    20. End Get
    21. End Property
    22. Public Sub RefreshList(ByVal key As String)
    23. 'Dim fileName As String
    24. Dim Files = New System.IO.DirectoryInfo(path + "\Indexierung").GetFiles("*.*", IO.SearchOption.TopDirectoryOnly)
    25. woerterbuchS.AddRange(Files.Select(Function(f) f.Name).ToArray())
    26. Dim LA() As String = woerterbuchS.ToArray
    27. Me.ListBox1.Items.Clear()
    28. find_key_arg = key & "*"
    29. Dim t() As String = Array.FindAll(LA, AddressOf find_key)
    30. If t.Count > 0 Then
    31. If key = "" Or t(t.Length - 1) = key Then
    32. _iskeyword = False
    33. Me.Hide()
    34. Else
    35. _iskeyword = True
    36. Me.ListBox1.Items.AddRange(t)
    37. Me.ListBox1.SelectedIndex = 0
    38. Me.Show()
    39. End If
    40. Else
    41. _iskeyword = False
    42. Me.Hide()
    43. End If
    44. End Sub
    45. Public ReadOnly Property IsKeyWord() As Boolean
    46. Get
    47. Return _iskeyword
    48. End Get
    49. End Property
    50. Public ReadOnly Property IsBestKeyWord() As String
    51. Get
    52. If _iskeyword = True Then
    53. Return _isbestkeyword
    54. Else
    55. Return ""
    56. End If
    57. End Get
    58. End Property
    59. Private find_key_arg As String
    60. Private Function find_key(ByVal s As String) As Boolean
    61. If s Like find_key_arg Then
    62. Return True
    63. Else
    64. Return False
    65. End If
    66. End Function
    67. End Sub
    68. End Class
    Metal-Schweiz wurde nun offiziell veröffentlich nach all den Jahren :)

    Ich hab es jetzt nicht komplett überprüft, aber es scheint als addest du immer die gesamte Liste, allerding machst du die Listbox vorher nicht leer, daher wird die Liste immer länger.
    Falsch ich dich völlig Falsch verstanden hab lese ich mir deinen Beitrag gleich noch mal richtig durch :)
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Ja genau so hab ich auch gedacht, klar ein clear wäre angebracht...
    EDIT: Nur eben weiss ich nicht wo ich da noch clearen soll?
    Wenn ich das ganze so anpasse ändert sich immer noch nichts:

    VB.NET-Quellcode

    1. Me.ListBox1.Items.Clear()
    2. Me.ListBox1.Items.AddRange(t)
    3. Me.ListBox1.SelectedIndex = 0

    Metal-Schweiz wurde nun offiziell veröffentlich nach all den Jahren :)

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

    Finde den Fehler echt nicht, kann mir niemand auf die Schnelle helfen?
    Metal-Schweiz wurde nun offiziell veröffentlich nach all den Jahren :)

    Den String hab ich auch schon versucht zu clearen mit einem einfach Files = Nothing nach dem(bin mir aber nicht sicher obs auch so sein soll)
    und weiss gar nicht recht wie ich das da einbauen soll, weil die Klasse immer wieder aufgerufen wird wenn in der Textbox ein Key gedrückt wird.
    EDIT: Bin doch doof, musste nur ne While Schlaufe machen
    Metal-Schweiz wurde nun offiziell veröffentlich nach all den Jahren :)

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

    @Orion : In der RefreshList-Sub schreibst du woerterbuchS.AddRange(...) und diese Instanz einfach eineZeile darüber clearen.
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Das hatte ich erst so, hatte nicht funktioniert. Habs jetzt so gelöst geht auch ganz gut:

    VB.NET-Quellcode

    1. Public i As Integer = 0
    2. Public Sub RefreshList(ByVal key As String)
    3. Dim Files = New System.IO.DirectoryInfo(path + "\Indexierung").GetFiles("*.*", IO.SearchOption.TopDirectoryOnly)
    4. While i <> 1
    5. woerterbuchS.AddRange(Files.Select(Function(f) f.Name).ToArray())
    6. i = i + 1
    7. End While
    Metal-Schweiz wurde nun offiziell veröffentlich nach all den Jahren :)

    och das ist nicht das einzige was bei diesen paar Zeilen einem die Fußnägel aufrollen lässt :)
    aber egal... wenns funktioniert..

    (spätestens wenn mal eine Schleife ohne localem i gemacht wird, wird die Frage kommen "Es werden keine Daten eingelesen.... warum" ?)



    Edit .. äh.. genau andersherum...
    die Liste wird dann länger und länger

    Hu? ... Ist es so schlimm? Hatte zuerst was mit diesem clear gemurkst und da kam nix schlaues raus und weil ich das mit der while Schleife eben immer in Java so gehandhabt hab, hab ichs jetzt auch hier so gemacht weil ich wusste das es so geht und ich keine Zeit hatte darauf zu warten das mich wer aufklärt. Google hat mich nur noch mehr verwirrt.
    Metal-Schweiz wurde nun offiziell veröffentlich nach all den Jahren :)

    sagt doch keiner :) Ist doch dein Programm.. wenn du damit zurecht kommst ist doch alles bestens.

    Geht nur z.B. um die Variable I die ja meist für Schleifen verwendet wird.
    wenn du irgendwo mal For i=0 to 20 machst.. wird i am ende der schleife den Wert 20 haben.
    Rufst du dann wieder deine Routine auf, wird die liste neu angehangen, da i <> 1 (also 20 <> 1 ) ist.

    und..
    Der Code in Zeile 4 wird außer beim 1. mal immer umsonst ausgeführt. Schadet zwar nichts, trägt aber nicht gerade zur Performance bei.
    packe doch diese Zeile einfach innerhalb deiner while -schleife.

    aber wie oben schon gesagt.. wenns funktioniert... prima...


    Noch ein Edit...
    Du musst wörterbuchs.clear UND auch deine Listbox vorm Addrange .claer machen (theoretisch)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „RoulettePilot“ ()

    Naja das Programm wurde jetzt dem Kunden vorgestellt und der ist recht heikel bei den Programmen und scheinbar ist er davon überzeugt das es besser ist als das vorherige, dann ist ja alles oke. Danke euch für die Hilfe :)
    Metal-Schweiz wurde nun offiziell veröffentlich nach all den Jahren :)