IndexOutOfRangeException bei RichTextBox.Lines und RichTextBox.GetLineFromCharIndex()

  • VB.NET

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

    IndexOutOfRangeException bei RichTextBox.Lines und RichTextBox.GetLineFromCharIndex()

    Hi Leute,
    folgendes Problem:
    Ich habe diesen Artikel hier im Forum gefunden, da ich genau das gleiche Problem hatte. Mein Quellcode sieht folgender Maßen aus (script ist die RichTextBox):

    VB.NET-Quellcode

    1. current_line = script.Lines(script.GetLineFromCharIndex(script.GetFirstCharIndexOfCurrentLine()))


    Nun erzählt mir VB, das ich die IndexOutOfRangeException nicht behandelt habe. Ich habe bereits durch diesen

    VB.NET-Quellcode

    1. MsgBox(script.GetLineFromCharIndex(script.GetFirstCharIndexOfCurrentLine))

    Test herausgefunden, dass GetFirstCharIndexOfCurrentLine() inner halb von GetLineFromCharIndex() liegt, da VB einem ja nur die ganze Zeile bei einer Exception anzeigt. Aber eigentlich sollte der Index von GetLineFromCharIndex() doch innerhalb von Lines liegen, oder ?(
    Das ganze läuft im KeyDown-Event der RichTextBox ab.

    Vielen Dank im voraus! :thumbsup:

    FritschFisch
    Drei Worte, die dein Programmieren verändern: Option Strict On

    .NET ist Null-basiert, die Indizes gehan also von 0 bis (Anzahl-1).
    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!
    Hättest Du mal Deinen Code so geschrieben, dass Du selbst ihn morgen noch verstehen kannst, wüstest Du, warum.

    VB.NET-Quellcode

    1. Private Sub RichTextBox1_KeyDown(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles script.KeyDown
    2. Dim current_line As String
    3. Dim CurrentLine As Integer = script.GetFirstCharIndexOfCurrentLine()
    4. Dim CharIndex As Integer = script.GetLineFromCharIndex(CurrentLine)
    5. current_line = script.Lines(CharIndex)
    6. Debug.WriteLine(CharIndex) ' hier bitte keine MessageBox!!!!
    7. End Sub
    Hier fliegt er raus:

    VB.NET-Quellcode

    1. current_line = script.Lines(CharIndex)
    Da Du noch kein Zeilenende eingegeben hast, ist die Anzahl der Zeilen 0 und script.Lines(CharIndex) greift ins Leere.
    Gib also der RTB initial einen Zeilenumbruch mit und es funktioniert. :D
    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!
    cool, danke :D
    Nun stellt sich mir nur noch die Frage, wenn der Nutzer aus unerfindlichen Gründen einfach den Zeilenumbruch, den ich so

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    2. script.Text = Chr(13)
    3. End Sub

    hinzugefügt habe wieder rausnimmt, dann kommt ja wieder eine Exception. Wie könnte ich das lösen?
    Drei Worte, die dein Programmieren verändern: Option Strict On

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

    @ErfinderDesRades: Im Gegensatz zu Dir habe ich dem TE mit meinem Post geholfen. :D
    @FritschFisch: Überprüfen wir zunächst die Anzahl der vorhandenen Zeilen:

    VB.NET-Quellcode

    1. Private Sub script_KeyDown(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles script.KeyDown
    2. Dim current_line As String
    3. Dim CharIndex As Integer = script.GetFirstCharIndexOfCurrentLine()
    4. Dim LineIndex As Integer = script.GetLineFromCharIndex(CharIndex)
    5. If script.Lines.Count = 0 Then
    6. current_line = script.Text
    7. Else
    8. current_line = script.Lines(LineIndex)
    9. End If
    10. Debug.Write(LineIndex)
    11. Debug.Write(" ")
    12. Debug.WriteLine(current_line)
    13. End Sub
    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!