【发布时间】:2010-04-22 19:53:48
【问题描述】:
假设我单击了 RichTextBox 控件内的某个位置。如何获取插入符号当前所在的当前行?
顺便说一句,这是检索该行的整个文本字符串。
【问题讨论】:
标签: c# .net winforms richtextbox
假设我单击了 RichTextBox 控件内的某个位置。如何获取插入符号当前所在的当前行?
顺便说一句,这是检索该行的整个文本字符串。
【问题讨论】:
标签: c# .net winforms richtextbox
这对我有用:
this.WordWrap = false;
int cursorPosition = this.SelectionStart;
int lineIndex = this.GetLineFromCharIndex(cursorPosition);
string lineText = this.Lines[lineIndex];
this.WordWrap = true;
【讨论】:
RichTextBox.GetLineFromCharIndex() 就是这样做的。传递 SelectionStart 属性值。
【讨论】:
一种方法是发送EM_LINEFROMCHAR Message。我敢肯定还有其他方法。
【讨论】:
我的答案比文森特的更棒,因为在得到正确的行号后,我注意到它在闪烁,非常可怕。所以我添加了一个内存富文本框来做那里的工作。
private int GetCharacterIndexOfSelection()
{
var wordWrappedIndex = this.SelectionStart;
RichTextBox scratch = new RichTextBox();
scratch.Lines = this.Lines;
scratch.SelectionStart = wordWrappedIndex;
scratch.SelectionLength = 1;
scratch.WordWrap = false;
return scratch.SelectionStart;
}
private int GetLineNumberOfSelection()
{
var selectionStartIndex = GetCharacterIndexOfSelection();
RichTextBox scratch = new RichTextBox();
scratch.Lines = this.Lines;
scratch.SelectionStart = selectionStartIndex;
scratch.SelectionLength = 1;
scratch.WordWrap = false;
return scratch.GetLineFromCharIndex(selectionStartIndex);
}
【讨论】:
这通过从文档的开头开始计数来工作。
var startlinenumber = FindLineNumber(RichText, RichText.Selection.Start);
var endlinenumber = FindLineNumber(RichText, RichText.Selection.End);
这是实际的功能。
int FindLineNumber(RichTextBox rtb, TextPointer p)
{
var findStart = p?.GetLineStartPosition(0);
if (findStart == null) return 0;
var startLinePosition = rtb.Document.ContentStart.GetLineStartPosition(0);
if (startLinePosition == null) return 0;
var foundLineNumber = 0;
while (true)
{
if (startLinePosition.CompareTo(findStart) >= 0)
{
break;
}
startLinePosition = startLinePosition.GetLineStartPosition(1, out var result);
if (result == 0)
{
break;
}
foundLineNumber++;
}
return foundLineNumber;
}
【讨论】:
如果您想从您现在正在调试的编辑器控件中获取当前行号,那么
int lineNumber = (new StackTrace()).GetFrame(1).GetFileLineNumber();
我认为它对您的问题有帮助。
【讨论】: