2011-12-16 12 views
7

C#でRichTextBoxを使用しています。それは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

は、インデックスの問題リクほとんどの音VBのコードですが、本当にあなたがRTB – MethodMan

+0

コードを持っているコードをseeinせずに一定にすることはできません私はここに掲示していますが、本質的に重要なものです。 RichTextBoxにテキストを入力し、そのコードを使用して下部にスクロールしてみます。それ以上の操作はありません。 –

+0

okこれは本当にすばやく聞かせてください。どの行をスクロールしたいのですか。つまり、どの単語をIndexOfを使用して検索しますか?私は下の例を掲載します。 – MethodMan

答えて

25

私はScrollToCaretとさらにいくつかの実験を行なったし、それだけで同じ位置に毎回終わることはありません。私の目標は一番下までスクロールすることだけに限られていたため、SB_PAGEBOTTOM(7)のwParamを使用してWM_VSCROLLメッセージ(277または0x115)をコントロールに送信することをお勧めします。これは一貫して私が必要とまったく同じすべての道一番下にスクロール:

[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の変換を "new 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 else else繰り返される単語や文字の最後のインスタンスが見つかったインデックスの位置に移動しなければなりません。これは意味があります.. – MethodMan

+0

実際、私がそのルートを試したければ、私はLastIndexOfに行くことができました。もちろん、繰り返す問題を解決してください。:)または私はまた、テキストの前に置くことを検討することができます。それから私は全くスクロールする必要はありません!笑 –

0

私は同じ問題を抱えている、私はそれが少しウサギのウォーレンのように聞こえるように、RTBはほとんどかなりのWindowsメッセージによって管理されていると思います。したがって、交互出力の理由はわかりません(ただし、少しバグがあります)。私はこのRTB.Scrolltocaretの点滅出力に関心がありますが、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

関連する問題