2009-04-11 24 views
12

如何使用C#滾動到WinForms文本框中的指定行?如何使用C#滾動到WinForms文本框中的指定行?

感謝

+0

什麼樣的文本框(ASP.NET,WinForms,WPF?)以及「go to」是什麼意思?選擇整條線?強制它將該行滾動到視圖中? – 2009-04-11 07:09:55

+0

WinForms ...將鼠標移動到指定的行 – alinpopescu 2009-04-11 07:15:18

+0

ican循環如何產生TextBox?我是編程初學者 – alinpopescu 2009-04-11 07:24:03

回答

26

這裏是你如何滾動到選擇:

textBox.ScrollToCaret(); 

滾動到指定行,你可以通過TextBox.Lines財產循環,共它們的長度找到的開始指定的行,然後設置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 2009-04-11 07:18:34

+0

我感謝你的回答... – alinpopescu 2009-04-11 07:41:54

+3

或者,「position = textBox.Text.Length」避免循環。 – 2011-09-01 22:47:15

0

的循環答案找到合適的插入位置有幾個問題。首先,對於大型文本框,速度很慢。其次,製表符似乎混淆了它。更直接的路線是使用所需的文本。

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

這段文字當然必須是唯一的,但是您可以從textBox.Lines數組中獲得它。就我而言,我已經在顯示的文本中添加了行號,所以這使得生活更輕鬆。

+0

循環確實有問題,它不適用於我。計數似乎每行都是1。無論如何,可以使用GetFirstCharIndexFromLine(),它爲我工作。 – Joh 2012-02-01 12:50:42

+0

-1:順便說一句,我相信你的方法是錯誤的。如果用戶想滾動到第1000行,這恰好是空的,該怎麼辦?您的代碼將轉到第一次出現的「1000」,不需要在第1000行。 – Joh 2012-02-01 12:52:20

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); 
} 

它的好處,在於選擇和尖位置不改變。

相關問題