2009-04-11 19 views
12

C#を使用してWinForms TextBoxで指定された行にスクロールするにはどうすればよいですか?C#を使用してWinForms TextBoxの指定された行にスクロールする方法はありますか?

textBox.ScrollToCaret(); 

指定した行までスクロールするには、あなたは可能性がTextBox.Linesプロパティを通じてループの開始を見つけるために、それらの長さを合計:ここ

+0

どのような種類のテキストボックス(ASP.NET、WinForms、WPF?)と「go to」とはどういう意味ですか?行全体を選択しますか?それを強制的に行にスクロールさせますか? –

+0

WinForms ...指定された行にマウスを移動 – alinpopescu

+0

TextBoxをどのように動かすか?私はプログラミングの初心者です質問を理解するために – alinpopescu

答えて

26

は、あなたが選択にスクロールする方法を説明します

感謝TextBox.SelectionStartを設定してキャレットを配置します。この(未テストコード)の線に沿って

何か:

int position = 0; 

for (int i = 0; i < lineToGoto; i++) 
{ 
    position += textBox.Lines[i].Length; 
} 

textBox.SelectionStart = position; 

textBox.ScrollToCaret(); 
+0

+1: – SirDemon

+0

私はあなたの答えに感謝します... – alinpopescu

+3

また、 "位置= textBox.Text.Length"ループを避けるために。 –

0

ルーピング答えが正しいキャレット位置を見つけるためには、問題のカップルを持っています。まず、大きなテキストボックスの場合、それは遅いです。第二に、タブ文字はそれを混乱させるようです。より直接的なルートは、必要な行のテキストを使用することです。

String textIWantShown = "Something on this line."; 
int position = textBox.Text.IndexOf(textIWantShown); 
textBox.SelectionStart = position; 
textBox.ScrollToCaret(); 

このテキストはもちろん、一意である必要がありますが、textBox.Lines配列から取得できます。私の場合は、私が表示していたテキストに行番号を付加していたので、これで人生が楽になりました。

+0

ルーピングには実際に問題があります。私。あたかも1行ごとにカウントがオフになっているかのようです。いずれにせよ、私のために働いたGetFirstCharIndexFromLine()を使うことができます。 – Joh

+0

-1:ところで、私はあなたの方法が間違っていると信じています。ユーザーが行1000にスクロールしたい場合はどうなりますか?あなたのコードは、最初の "1000"の出現に進みます。これは、1000行目である必要はありません。 – Joh

9
private void MoveCaretToLine(TextBox txtBox, int lineNumber) 
    { 
     txtBox.HideSelection = false; 
     txtBox.SelectionStart = txtBox.GetFirstCharIndexFromLine(lineNumber - 1); 
     txtBox.SelectionLength = txtBox.Lines[lineNumber - 1].Length; 
     txtBox.ScrollToCaret(); 
    } 
1

これは私が見つけた最良の解決策である:それは選択とキャレット位置が変更されていないこと、利益を有する

const int EM_GETFIRSTVISIBLELINE = 0x00CE; 
const int EM_LINESCROLL = 0x00B6; 

[DllImport("user32.dll")] 
static extern int SendMessage(IntPtr hWnd, int wMsg, int wParam, int lParam); 

void SetLineIndex(TextBox tbx, int lineIndex) 
{ 
    int currentLine = SendMessage(textBox1.Handle, EM_GETFIRSTVISIBLELINE, 0, 0); 
    SendMessage(tbx.Handle, EM_LINESCROLL, 0, lineIndex - currentLine); 
} 

関連する問題