如何获取TextBox中光标所在行号?解决长文本换行行号错误问题
解决TextBox自动换行导致逻辑行号计算错误的问题
这个问题我之前也碰到过——当TextBox开启自动换行(WordWrap)后,GetLineFromCharIndex返回的是物理显示行(也就是控件因为字符长度限制自动拆分的行),而不是你需要的逻辑行(按用户手动输入的回车分割的行),这就是行号计算出错的核心原因。
要获取真正的逻辑行号,我们需要自己统计光标位置前的换行符数量,因为逻辑行的本质是由\r\n(Windows标准换行)或\n(Unix换行)分隔的。下面是具体的解决代码:
自定义逻辑行号计算方法
private int GetLogicalLineNumber(TextBox textBox) { int cursorPosition = textBox.SelectionStart; // 光标在文本开头,直接返回第1行 if (cursorPosition == 0) return 1; // 截取光标之前的文本内容 string textBeforeCursor = textBox.Text.Substring(0, cursorPosition); // 统计所有换行符'\n'的数量(覆盖Unix和Windows换行的情况,因为Windows换行是\r\n,最后也会有一个\n) int lineBreakCount = textBeforeCursor.Count(c => c == '\n'); // 特殊处理:如果文本以'\r'结尾(比如光标刚好在\r\n的\r位置),需要额外加1 if (textBeforeCursor.EndsWith("\r")) lineBreakCount++; // 行号 = 换行符数量 + 1(因为第一行没有前置换行符) return lineBreakCount + 1; }
使用方法替换原有代码
把你原来的行号计算代码替换成下面的调用:
int logicalLineNumber = GetLogicalLineNumber(textBox1); textBoxLineNumber.Text = logicalLineNumber.ToString();
为什么这个方法有效?
不管TextBox因为自动换行把一行拆成多少个物理显示行,只要用户没有手动输入回车,这些物理行都属于同一个逻辑行。这个方法通过统计光标前的所有换行符数量,就能准确得到当前的逻辑行号,完全不受自动换行的影响。
内容的提问来源于stack exchange,提问作者JPG
相关产品推荐
相关产品推荐

