You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:46:15