TextBox.GetLastVisibleLineIndex Methode not found

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Peter329.

    TextBox.GetLastVisibleLineIndex Methode not found

    Hi,

    ich möchte den höchsten Index der in einer Textbox angezeigten Zeile ermitteln. Das ist NICHT die Anzahl der Zeilen, weil die mit "wrap" umgebrochen werden können.

    Die Funktion "TextBox.GetLastVisibleLineIndex" scheint genau dies zu tun ... aber wenn ich das kodiere, erhalte ich den Fehler:

    Error BC30456 'GetLastVisibleLineIndex' is not a member of 'TextBox'.

    Ich habe nach einer Lösung gesucht ... könnte es sein, dass dies nur für eine WPFTextbox funktioniert?

    Intellisense zeigt keine sinnvolle Lösung an ... verschiedene Imports haben auch nicht geholfen.

    Mache ich etwas falsch ? Geht das mit meinem Standard VB Projekt nicht ? Wie kann ich die gewüschte Zeilenanzahl erhalten ?

    LG
    Peter
    Das ist nur für die WpfTextBox verfügbar.
    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.
    OK, dann hab ich das doch richtig gelesen.

    Gibt es denn eine Möglichkeit in einer "normalen" Textbox den Index der letzten angezeigten Zeile zu ermitteln?

    Der Hintergrund: Ich suche einen Teilstring in der Textbox ... und wenn dieser Teilstring gefunden wird, dann möchte ich diesen String auch "sichtbar" machen.

    Die aktuelle Position der Textbox erhalte ich mit

    VB.NET-Quellcode

    1. Dim myScrollPos = GetScrollPos(myTextBox.Handle, SB_VERT)


    Es würde mir also genügen die Anzahl der angezeigten Zeilen in der Textbox zu wissen, oder aber den Index der letzten angezeigten Zeile.

    Ich kenne auch den Index der Zeile, in der ich meinen Teilstring gefunden habe:

    VB.NET-Quellcode

    1. Dim inew = GetLineFromChar(txtData, CType(i, IntPtr))


    Es würde mir also genügen, wenn ich abfragen könnte, ob diese Zeile aktuell angezeigt wird.

    Die Box neu zu positionieren ist dann übrigens kein Problem mehr. Das geht mit

    VB.NET-Quellcode

    1. SetScrollPos(txtData.Handle, SB_VERT, CInt(inew - iold), True)
    2. SendMessage(txtData.Handle, EM_LINESCROLL, 0, CInt(inew - iold))


    Ich hoffe, ich habe mein Problem verständlich machen können ... vielleicht hat ja jemand eine Idee, wie ich herausfinde, ob eine bestimmte Zeile in der Textbox angezeigt wird oder nicht.

    LG
    Peter

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

    @Fakiz

    Danke für deinen Rat.

    Da hast du schon recht ... so kann ich den Zeilenindex der gefundenen Zeile ermitteln. Aber das ist ja auch unproblematisch.

    Ich benötige aber den Zeilenindex der letzten sichtbaren Zeile der Textbox. Das ist etwas anderes. Oder aber die Anzahl der sichtbaren Zeilen in der Textbox.

    Möglicherweise bleibt mir nichs anderes übrig als diese Anzahl zu berechnen (aus der Höhe der Textbox und der Höhe des gewählten Font). Aber das ist natürlich keine ganz so prickelnde Lösung. Schöner wäre das schon, wenn es dafür eine vernünftige Methode bzw. ein API gäbe ... (so wie das ja auch für eine DGV möglich ist).
    Aber wenn Du Dir den Code von GetLastVisibleLineIndex ansiehst (WPF-Testprojekt aufmachen, Code reinschreiben, GetLastVisibleLineIndex anwählen und F12), dann siehst Du, dass Microsoft es genauso »unsauber« macht:

    C#-Quellcode

    1. //
    2. // Zusammenfassung:
    3. // Gibt den Zeilenindex für die letzte Zeile, die derzeit im Textfeld angezeigt
    4. // wird.
    5. //
    6. // Rückgabewerte:
    7. // Der nullbasierte Index der letzten sichtbaren Zeile im Textfeld.
    8. public int GetLastVisibleLineIndex()
    9. {
    10. //[hier Vorabprüfcode, ist hierfür unwichtig]
    11. return (int)Math.Floor((base.VerticalOffset + base.ViewportHeight - 1.0) / GetLineHeight());
    12. }
    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.
    Ja wenn das so ist ...

    ... dann will ich mal hier meine Lösung für alle die es interessieren könnte einstellen:

    VB.NET-Quellcode

    1. Private Sub MakeVisible(i As Integer)
    2. 'Check index
    3. If i < 0 OrElse i > txtData.Text.Length - 1 Then Exit Sub
    4. 'Get top line and found line index
    5. Dim itop = GetScrollPos(txtData.Handle, SB_VERT)
    6. Dim ifound = CInt(GetLineFromChar(txtData, CType(i, IntPtr)))
    7. 'Compute lines per Display
    8. Dim myDataHeight = txtData.Height
    9. Dim myLineHeight = txtData.Font.GetHeight
    10. Dim LinesPerDisplay = CInt(myDataHeight / myLineHeight)
    11. 'Position text box
    12. If ifound < itop OrElse
    13. ifound > itop + LinesPerDisplay - 3 Then
    14. SetScrollPos(txtData.Handle, SB_VERT, ifound - itop - 3, True)
    15. SendMessage(txtData.Handle, EM_LINESCROLL, 0, CInt(ifound - itop - 3))
    16. End If
    17. End Sub


    Das funzt jetzt sehr zufriedenstellend ... wenn der gefundene Index aus dem Display läuft, dann wird der Scroll neu positioniert.

    Ohne euer Feedback hätte ich mich nicht getraut so eine hausbackene Lösung zu schreiben. Vielen Dank an die Ratgeber, Daumen hoch und Problem gelöst.

    LG
    Peter

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