2011-12-16 3 views
7

Я работаю с RichTextBox в C#. Он существует в TabPage. Когда TabPage выбран, я хочу заполнить RichTextBox и прокручивать до конца. Я попытался незначительные вариации решений для этого общего вопроса, главным из которых по линиям:Несогласованные результаты с RichTextBox ScrollToCaret

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

или:

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

Это вызывает противоречивые результаты, хотя и предсказуемым образом. Он будет чередоваться между прокруткой вниз и прокруткой одной строки до нижней. Соответственно проиллюстрирована (извините за ссылки, новый пользователь, так что я не могу отправлять изображения):
Successfully scrolled to bottom
Scrolled to one line short of the bottom
Я удивлен, не найдя ничего, упоминая это поведение с помощью моих поисков, и решил спросить, если кто здесь есть столкнулись с этим и/или имели решение. Если дело доходит до этого, я полагаю, я могу пойти с чем-то по строкам itsmatt's answer.

+0

звучит почти Лик вопрос индексации, но не могу быть уверен, без Seein код, который у вас есть для RTB – MethodMan

+0

Кодекса Я опубликовал здесь, по сути, все, что имеет значение. Я заполняю RichTextBox некоторым текстом, а затем попробую прокрутить его до конца с помощью этого кода. Дальнейшего взаимодействия с контролем нет. –

+0

ok позвольте мне спросить вас об этом быстро. Какую строку вы хотите прокрутить до какого-либо слова .. найдите строку с помощью IndexOf. Я отправлю пример ниже. – MethodMan

ответ

25

Я сделал некоторые дальнейшие эксперименты с ScrollToCaret, и он просто не в конечном итоге в том же положении каждый раз. Поскольку моя цель ограничивается только прокруткой до конца, это был хороший кандидат для отправки сообщения WM_VSCROLL (277 или 0x115) в элемент управления с помощью wParam из SB_PAGEBOTTOM (7). Это постоянно прокручивает весь путь до самого дна так же, как мне было нужно:

[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

Большое спасибо. У меня была такая же проблема, и это сводило меня с ума. Это решение последовательно прокручивается вниз. –

+0

Если вы поместите преобразование из pagebottom в «новый System.IntPtr (SB_BOTTOM)», тогда будет работать и автоматический перевод на VB.NET. –

+0

Большое спасибо. У меня тоже была такая же проблема. – Deulis

1

Изменить это, чтобы соответствовать ваш рабочий код ..

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

Хммм, возможно, это сработает для кого-то. Я не уверен, что это повлияет на несоответствие, которое я заметил, поскольку проблема, похоже, связана с ScrollToCaret. То, что я говорил в моем вопросе, заключается в том, что я могу сказать это «MyRichTextBox.ScrollToCaret();» при тех же обстоятельствах каждый раз и достигать разных результатов. Как бы то ни было, природа моего содержимого RichTextBox делает поиск определенной строки ненадежной, так как она содержит текст, который может повторяться. –

+0

ooh .. это не очень хорошо, если текст повторяется, однако вы можете создать некоторые для каждого кода, которые будут циклически проходить и подсчитывать, сколько раз слово, которое вы ищете, существует .. если оно существует один раз .. тогда MyRichTextBox.ScrollToCaret еще вы бы нужно перейти к этой позиции индекса, где был найден последний экземпляр повторяющегося слова или символа .. это имеет смысл. – MethodMan

+0

Да, на самом деле, если бы я хотел попробовать этот маршрут, я мог бы просто пойти на LastIndexOf, и это было бы Разумеется, решить повторяющуюся проблему.:) Или я мог бы также рассмотреть возможность добавления текста. Тогда мне не нужно прокручивать вообще! haha –

0

У меня такая же проблема, я предполагаю, что RTB почти вполне управляется Windows Messages так это звучит немного как кролик лабиринт. Поэтому я не знаю причины чередующегося выхода (но у него немного неприятный вкус). Меня интересует этот вывод RTB.Scrolltocaret, но в программе VB. Комплименты для вашего радикального решения: он отлично работает.

Если кто-нибудь столкнуться с этой аномалией в этой среде программирования, вот 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

Код отсутствует ... –

+0

Извините, но я пишу по телефону, поэтому в экономной версии страницы я не видел кнопку кода (но я заметил, что 4 пробела эквивалентны) – Bento

Смежные вопросы