2011-12-16 13 views
7

Sto lavorando con un RichTextBox in C#. Esiste su una TabPage. Quando si seleziona TabPage, il mio obiettivo è compilare il RichTextBox e scorrere fino alla fine. Ho provato le leggere variazioni su soluzioni per questo problema comune, il principale dei quali lungo le linee di:Risultati incoerenti con RichTextBox ScrollToCaret

MyRichTextBox.Select(MyRichTextBox.Text.Length, 0); 
MyRichTextBox.ScrollToCaret(); 

o:

MyRichTextBox.SelectionStart = MyRichTextBox.Text.Length; 
MyRichTextBox.ScrollToCaret(); 

Questo sta producendo risultati inconsistenti, anche se in modo prevedibile. Si alternerà tra lo scorrimento verso il basso e lo scorrimento di una riga in basso rispetto al fondo. Rispettivamente illustrato (mi dispiace per i collegamenti, nuovo utente quindi non posso postare le immagini):
Successfully scrolled to bottom
Scrolled to one line short of the bottom
Sono sorpreso di trovare niente di menzionare questo comportamento attraverso le mie ricerche, e hanno deciso di chiedere se qualcuno ha qui incontrato questo, e/o ha una soluzione in mente. Se si arriva a questo, suppongo di poter andare con qualcosa sulla falsariga di itsmatt's answer.

+0

suona quasi lik un problema di indicizzazione ma non può davvero essere certi, senza seein il codice che avete per la RTB – MethodMan

+0

Il codice Ho postato qui è essenzialmente tutto ciò che conta. Compilo il RichTextBox con del testo e poi provo a scorrere verso il basso usando quel codice. Non c'è ulteriore interazione con il controllo. –

+0

ok lascia che ti chieda questo vero veloce .. quale linea vuoi scorrere per sapere quale parola .. trovare la linea usando IndexOf pubblicherò un esempio qui sotto. – MethodMan

risposta

25

ho fatto qualche ulteriori sperimentazioni con ScrollToCaret e semplicemente non finisce nella stessa posizione ogni volta. Dato che il mio obiettivo è limitato a scorrere fino in fondo, è stato un buon candidato per inviare il messaggio WM_VSCROLL (277 o 0x115) al controllo, con wParam di SB_PAGEBOTTOM (7). Questo scorre costantemente tutta la strada fino in fondo esattamente come avevo bisogno:

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam); 
private const int WM_VSCROLL = 277; 
private const int SB_PAGEBOTTOM = 7; 

public static void ScrollToBottom(RichTextBox MyRichTextBox) 
{ 
    SendMessage(MyRichTextBox.Handle, WM_VSCROLL, (IntPtr)SB_PAGEBOTTOM, IntPtr.Zero); 
} 
+0

Grazie mille. Ho avuto lo stesso identico problema e mi stava facendo impazzire. Questa soluzione scorre costantemente verso il basso. –

+0

Se si imposta la conversione da pagebottom come "nuovo System.IntPtr (SB_BOTTOM)", funzionerà anche la traduzione automatica su VB.NET. –

+0

Grazie mille. Ho avuto lo stesso identico problema. – Deulis

1

Modificare questo per misura il vostro codice di lavoro ..

String gotoCaret = "Something on this line."; 
int position = textBox.Text.IndexOf(gotoCaret); 
MyRichTextBox.SelectionStart = position; 
MyRichTextBox.ScrollToCaret(); 
+0

Hmmm, è possibile che funzioni per qualcuno. Non sono sicuro che farebbe la differenza sull'incoerenza che ho notato, poiché il problema sembra essere con ScrollToCaret. Quello che stavo dicendo nella mia domanda è che posso dire "MyRichTextBox.ScrollToCaret();" ogni volta nelle stesse circostanze, e ottenere risultati diversi. In ogni caso, la natura del mio contenuto RichTextBox rende inaffidabile la ricerca di una stringa particolare, poiché contiene del testo che potrebbe ripetersi. –

+0

ooh .. non va bene se il testo si ripete, ma potresti crearne un po 'per ogni codice che passerebbe in loop e contare per quante volte la parola che stai cercando esista ... se esiste una volta .. poi MyRichTextBox.ScrollToCaret altro devo andare in quella posizione dell'indice di dove è stata trovata l'ultima istanza della parola o del carattere ripetuto. Questo ha senso .. – MethodMan

+0

Sì, infatti se volessi provare quella strada, potrei semplicemente andare su LastIndexOf e questo sarebbe risolvere il problema ricorrente, naturalmente.:) O potrei anche considerare di prependere il testo. Quindi non ho bisogno di scorrere affatto! haha –

0

Ho lo stesso problema, credo che un RTB è quasi del tutto gestito da messaggi di Windows in modo che suona un po 'come un labirinto di coniglio. Non so, quindi, il motivo dell'output alternato (ma ha un po 'di gusto). Sono interessato con questo output di sfarfallio RTB.Scrolltocaret ma in un programma VB. Complimenti per la tua soluzione drastica: funziona perfettamente.

Se una persona incontrare questa anomalia in questo ambiente di programmazione, ecco il codice VB

Imports System.Runtime.InteropServices 
Public Class Form 
<DllImport("user32.dll",CharSet:=CharSet.Auto)> _ 
Public Shared Function SendMessage(_ 
ByVal hWnd As IntPtr, _ 
ByVal wMsg As Integer, _ 
ByVal wParam As IntPtr, _ 
ByVal lParam As IntPtr) As Integer 
End Function 
Const WM_SCROLL = 277 
Const SB_PAGEBOTTOM = 7 
Sub ScrollToBottom(ByVal RTBName As RichTextBox) 
    SendMessage(RTBName.Handle, _ 
       WM_SCROLL, _ 
       SB_PAGEBOTTOM, _ 
       IntPtr.Zero) 
End Sub 'then call ScrollToBottom instead of ScrollToCaret 
+0

Manca il codice ... –

+0

Scusa ma sto scrivendo da un telefono, quindi nella versione economica della pagina non ho visto il pulsante del codice (ma ho notato che 4 barre dello spazio sono equivalenti) – Bento

Problemi correlati