从Char索引确定逻辑行(Winforms TextBox)

时间:2010-03-03 23:15:38

标签: c# .net winforms textbox

如果我使用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

有没有人知道从字符索引而不是显示的行找到逻辑行的解决方案?

5 个答案:

答案 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');