如果我使用textBox.GetLineFromCharIndex(int)
在TextBox
中调用WordWrap = true
,则会返回用户看到的行索引(换行计为多行),而不是根据换行。
Line one extends to // <- word wrapped here. // <- logical line 1, GetLineFromCharIndex returns line 2 This is line two. // <- logical line 2, GetLineFromCharIndex returns line 3
有没有人知道从字符索引而不是显示的行找到逻辑行的解决方案?
答案 0 :(得分:2)
查找整个文本中新行的出现次数,直至char索引。
也许首先将文本框文本的子字符串放到char索引中。在换行符上使用拆分,并计算结果。
或者,循环解决方案将使用索引函数并计算在char索引中找到的换行符数。
答案 1 :(得分:1)
我倾向于认为这个解决方案比寻找新行更快。您需要使用“SendMessage”消息“EM_LINEFROMCHAR”到文本框中
[DllImport("User32.DLL")] public static extern int SendMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam); public const int EM_LINEFROMCHAR = 0xC9; int noLines = SendMessage(TextBox.Handle, EM_LINEFROMCHAR, TextBox.TextLength, 0);
通过这种方式,您可以根据字符串的长度找出最后一行......这将告诉您使用的逻辑行数......
希望这有帮助,
答案 2 :(得分:0)
你也可以使用字符串扩展方法wuth一个Func,lambda表达式或者其他什么,如果你不想写一个循环 -
long lineNumber = textBox.Text.Substring(0, textBox.SelectionStart).LongCount(chr => chr == '\r');
这将返回基于0的行号。
答案 3 :(得分:0)
以下对我有用 - 没有明显的性能影响
this.WordWrap = false;
int lineIndex = this.GetLineFromCharIndex(this.SelectionStart);
string lineText = this.Lines[lineIndex];
this.WordWrap = true;
答案 4 :(得分:0)
当我单击 RichTextBox 时,我使用此代码查找行索引:
string sub = richtextbox1.Text.Substring(0, richtextbox1.SelectionStart);
int index = sub.Count(f => f == '\n');