2011-12-16 15 views
7

Pracuję z RichTextBox w C#. Istnieje na stronie TabPage. Po wybraniu TabPage, zamierzam wypełnić RichTextBox i przewinąć do końca. Próbowałem nieznaczne wariacje na temat rozwiązań dla tej wspólnej pytanie, z których głównym jest wzdłuż linii:Niespójne wyniki z RichTextBox ScrollToCaret

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

czyli

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

to produkującą niespójne wyniki, aczkolwiek w sposób przewidywalny. Będzie się wyświetlał na przemian, przewijając do dołu i przewijając jedną linię krótszą od dolnej. Odpowiednio zilustrowane (przepraszam za linki, nowy użytkownik, więc nie mogę dodawać zdjęć):
Successfully scrolled to bottom
Scrolled to one line short of the bottom
Jestem zaskoczony, aby znaleźć nic wspomnieć o tym zachowanie przez moich poszukiwań, i zdecydowaliśmy się zapytać, czy ktoś tu ma napotkał to i/lub ma na myśli rozwiązanie. Jeśli chodzi o to, przypuszczam, że mogę iść z czymś podobnym do linii itsmatt's answer.

+0

brzmi niemal lik emisji podziałowej, ale naprawdę nie można być pewnym, bez seein kod, który masz na RTB – MethodMan

+0

kodu Zamieszczam tutaj zasadniczo wszystko, co ważne. Wypełniam tekst RichTextBox pewnym tekstem, a następnie spróbuj przewinąć do dołu, używając tego kodu. Nie ma dalszej interakcji z kontrolą. –

+0

ok, pozwól, że zapytam Cię to naprawdę szybko .. w jakim wierszu chcesz przewinąć do np. Jakie słowo ... znajdź wiersz za pomocą IndexOf Postawię poniższy przykład. – MethodMan

Odpowiedz

25

zrobiłem kilka dalszych eksperymentów z ScrollToCaret i to po prostu nie kończy się w tym samym miejscu za każdym razem. Ponieważ mój cel jest ograniczony tylko do przewijania do samego dołu, był to dobry kandydat do wysłania komunikatu WM_VSCROLL (277 lub 0x115) do kontrolki, z wParam z SB_PAGEBOTTOM (7). To stale przewija się przez całą drogę do samego dna dokładnie jakbym potrzebne:

[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

Dziękuję bardzo. Miałem dokładnie ten sam problem i doprowadzało mnie to do szału. To rozwiązanie konsekwentnie przewija się na sam dół. –

+0

Jeśli umieścisz konwersję z pagebottom jako "new System.IntPtr (SB_BOTTOM)", to również będzie działać automatyczne tłumaczenie na VB.NET. –

+0

Dziękuję bardzo. Miałem dokładnie ten sam problem. – Deulis

1

Zmień ten kod, aby dopasować swoją pracę ..

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

Hmmm, to możliwe, że to by działało dla kogoś. Nie jestem pewien, czy miałoby to wpływ na niespójność, którą zauważyłem, ponieważ wydaje się, że problem dotyczy ScrollToCaret. W moim pytaniu mówiłem, że mogę powiedzieć "MyRichTextBox.ScrollToCaret();" w tych samych okolicznościach za każdym razem i osiągnąć różne wyniki. W każdym razie, natura mojej zawartości RichTextBox sprawia, że ​​wyszukiwanie określonego ciągu jest niewiarygodne, ponieważ zawiera tekst, który może się powtarzać. –

+0

ooh .. to nie jest dobre, jeśli tekst się powtarza, ale możesz utworzyć niektóre dla każdego kodu, który będzie pętli i policzyć ile razy słowo szukasz istnieje .. jeśli istnieje raz .. to MyRichTextBox.ScrollToCaret jeszcze byś musiałem przejść do tej pozycji indeksu, gdzie znaleziono ostatnie wystąpienie powtórzonego słowa lub znaku .. czy to ma sens .. – MethodMan

+0

Tak, w rzeczywistości, gdybym chciał wypróbować tę trasę, mógłbym po prostu wybrać LastIndexOf i to by było oczywiście rozwiązać powtarzający się problem.:) Lub też mógłbym rozważyć kontynuowanie tekstu. Wtedy wcale nie muszę przewijać! haha –

0

Mam ten sam problem, odgadnąć RTB jest prawie całkiem zarządzany przez Windows, Messages tak to brzmi trochę jak Warren królika. Nie wiem więc, dlaczego tak się dzieje na przemian (ale ma on nieco smak błędu). Obawiam się tego migotania wyjścia RTB.Scrolltocaret, ale w programie VB. Komplementy dla twojego drastycznego rozwiązania: Działa idealnie.

Gdyby ktoś napotka tę anomalię w tym środowisku programowania, oto kod 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

Brakuje kodu ... –

+0

Przepraszam, ale piszę telefonicznie, więc w ekonomicznej wersji strony nie widziałem przycisku kodu (ale zauważyłem, że 4 spacje są równoważne) – Bento