【发布时间】:2010-03-03 23:15:37
【问题描述】:
如果我用WordWrap = true 在TextBox 中调用textBox.GetLineFromCharIndex(int),它会返回用户看到的行索引(换行算作多行),而不是根据换行符返回的行。
第一行延伸到 //有谁知道从字符索引而不是显示的行中找到逻辑行的解决方案?
【问题讨论】:
如果我用WordWrap = true 在TextBox 中调用textBox.GetLineFromCharIndex(int),它会返回用户看到的行索引(换行算作多行),而不是根据换行符返回的行。
第一行延伸到 //有谁知道从字符索引而不是显示的行中找到逻辑行的解决方案?
【问题讨论】:
查找整个文本中换行符出现的次数,直到您的 char 索引。
也许首先将文本框文本的子字符串获取到您的 char 索引。在换行符上使用 Split,并计算结果。
或者,循环解决方案将使用索引函数并计算找到多少换行符直到您的 char 索引。
【讨论】:
我倾向于认为这种解决方案比循环寻找换行符更快。您需要在带有“EM_LINEFROMCHAR”消息的文本框中输入“SendMessage”
[DllImport("User32.DLL")] 公共静态外部 int SendMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam); 公共常量 int EM_LINEFROMCHAR = 0xC9; int noLines = SendMessage(TextBox.Handle, EM_LINEFROMCHAR, TextBox.TextLength, 0);这样,你可以根据字符串的长度找出最后一行...这将告诉您使用的逻辑行数...
希望这会有所帮助,
【讨论】:
以下对我有用 - 没有明显的性能影响
this.WordWrap = false;
int lineIndex = this.GetLineFromCharIndex(this.SelectionStart);
string lineText = this.Lines[lineIndex];
this.WordWrap = true;
【讨论】:
如果您不想编写循环,也可以使用字符串扩展方法,例如 Func、lambda 表达式或其他任何东西-
long lineNumber = textBox.Text.Substring(0, textBox.SelectionStart).LongCount(chr => chr == '\r');
这将返回基于 0 的行号。
【讨论】:
当我点击 RichTextBox 时,我使用此代码查找行索引:
string sub = richtextbox1.Text.Substring(0, richtextbox1.SelectionStart);
int index = sub.Count(f => f == '\n');
【讨论】: